Laravel-excel: [BUG] ์‘๋‹ต ํ—ค๋”(cors)

์— ๋งŒ๋“  2016๋…„ 11์›” 16์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Maatwebsite/Laravel-Excel

ํŒจํ‚ค์ง€ ๋ฒ„์ „, Laravel ๋ฒ„์ „

๋ผ๋ผ๋ฒจ 5.1
๋ผ๋ผ๋ฒจ ์—‘์…€ 2.1.0
barryvdh/laravel-cors 0.8.0

์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™

๋‚˜๋Š” laravel-excel์ด laravel-cor์™€ ์ž˜ ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ํ–‰๋™

laravel-excel์€ laravel-cors๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์‘๋‹ต์— ์„ค์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํ—ค๋” "Access-Control-Allow-Origin" ๋ฐ "Vary"

๋‹ค์šด๋กœ๋“œ ๋ฐ ๋‚ด๋ณด๋‚ด๊ธฐ ๋ฐฉ๋ฒ•์—์„œ laravel-excel์€ Illuminate\Http\Response๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด ๋ชจ๋“  ๊ฒƒ์„ ๊นจ๋œจ๋ฆฐ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

ํ–‰๋™์„ ์žฌํ˜„ํ•˜๋Š” ๋‹จ๊ณ„

www.example-a.com ์—์„œ javascript(๋‚ด ๊ฒฝ์šฐ angularjs ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)์—์„œ www.example-b.com (laravel + laraver-cors + laravel-excel์ด ์žˆ๋Š” ์„œ๋ฒ„)์œผ๋กœ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

PHPExcel์ด ์‹ค์ œ ๋‹ค์šด๋กœ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์ด ํŒจํ‚ค์ง€๋Š” Response ์‚ฌ์šฉ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ—ค๋”๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜).

->download('xls', [yourheader])

๋ชจ๋“  3 ๋Œ“๊ธ€

PHPExcel์ด ์‹ค์ œ ๋‹ค์šด๋กœ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์ด ํŒจํ‚ค์ง€๋Š” Response ์‚ฌ์šฉ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ—ค๋”๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜).

->download('xls', [yourheader])

์ด๊ฒƒ์„ ๋ฌธ์„œ์— ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” ์‹ค์ œ๋กœ Lumen ํ”„๋กœ์ ํŠธ์—์„œ Laravel-Excel์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ Excel ํŒŒ์ผ๋กœ ๋‚ด๋ณด๋‚ด๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ๋‹ค์šด๋กœ๋“œํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์‚ฌ์šฉ์ž๋‚ด๋ณด๋‚ด๊ธฐ :

use App\User;
use Maatwebsite\Excel\Concerns\FromCollection;

class UsersExport implements FromCollection
{
    /**
    * <strong i="8">@return</strong> \Illuminate\Support\Collection
    */
    public function collection()
    {
        return User::all();
    }
}

๋‚ด ์ปจํŠธ๋กค๋Ÿฌ :

public function excel()
    {
        return Excel::download(new UsersExport(),'users.xlsx');
    } 

์›น.php :
$router->get('/download', 'CommunicationController<strong i="17">@excel</strong>');

๊ทธ๋ฆฌ๊ณ  Excel() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

image

๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฏธ ์˜ค๋ž˜์ „์— CorsMiddleware.php๋ฅผ ์ƒ์„ฑํ•˜์—ฌ bootstrap/app.php์— ์ถ”๊ฐ€ํ–ˆ๊ณ  ๋‹ค๋ฅธ ๋ชจ๋“  ๊ธฐ๋Šฅ์€ ๋•๋ถ„์— ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์•ฑ.php :

$app->middleware([
    App\Http\Middleware\CorsMiddleware::class
]);

CorsMiddleware.php :

<?php

namespace App\Http\Middleware;

use Closure;

class CorsMiddleware
{
    /**
     * Handle an incoming request.
     *
     * <strong i="30">@param</strong>  \Illuminate\Http\Request  $request
     * <strong i="31">@param</strong>  \Closure  $next
     * <strong i="32">@return</strong> mixed
     */
    public function handle($request, Closure $next)
    {
        $headers = [
            'Access-Control-Allow-Origin'      => '*',
            'Access-Control-Allow-Methods'     => 'POST, GET, OPTIONS, PUT, DELETE',
            'Access-Control-Allow-Credentials' => 'true',
            'Access-Control-Max-Age'           => '86400',
            'Access-Control-Allow-Headers'     => 'Content-Type, Authorization, X-Requested-With, api_token'
        ];

        if ($request->isMethod('OPTIONS'))
        {
            return response()->json('{"method":"OPTIONS"}', 200, $headers);
        }

        $response = $next($request);
        foreach($headers as $key => $value)
        {
            $response->header($key, $value);
        }

        return $response;
    }
}

๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ์žŠ์—ˆ๋‚˜์š”? ๋‚˜๋Š” ์–ด์ œ๋ถ€ํ„ฐ ๋ถ™์–ด ์žˆ์—ˆ๊ณ  ์ •๋ง ๋‹น์‹ ์˜ ๋„์›€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค :'(

์—ฌ๊ธฐ์—์„œ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” Lumen๊ณผ maatwebsite/excel์˜ ๋ฒ„์ „์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"require": {
        "php": ">=7.1.3",
        "guzzlehttp/guzzle": "^6.3",
        "laravel/lumen-framework": "5.7.*",
        "maatwebsite/excel": "^3.1",
        "phpoffice/phpspreadsheet": "^1.6",
        "vlucas/phpdotenv": "~2.2"
    },

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰