Laravel-excel: [์งˆ๋ฌธ] ๊ฐ€์ ธ ์˜ค๊ธฐ ์ด๋ฒคํŠธ ํ›„

์— ๋งŒ๋“  2018๋…„ 12์›” 07์ผ  ยท  24์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Maatwebsite/Laravel-Excel

์ „์ œ ์กฐ๊ฑด

๋ฒ„์ „

  • PHP ๋ฒ„์ „ : 7.2
  • ๋ผ ๋ผ๋ฒจ ๋ฒ„์ „ : 5.7
  • ํŒจํ‚ค์ง€ ๋ฒ„์ „ : 3.1

๊ธฐ์ˆ 

๊ฐ€์ ธ ์˜ค๊ธฐ ํ›„ ์ด๋ฒคํŠธ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. :(
์• ํ”„ํ„ฐ ์‹œํŠธ๊ฐ€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ญ˜ ์ž˜๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋“ฑ๋ก ์ด๋ฒคํŠธ์™€ ์ž๋™ ๋“ฑ๋ก ์ด๋ฒคํŠธ๋ฅผ ๋ชจ๋‘ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ฝ”๋“œ

namespace App\Imports;

use App\Order;
use App\Order\Address;
use Illuminate\Contracts\Queue\ShouldQueue;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\RegistersEventListeners;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithBatchInserts;
use Maatwebsite\Excel\Concerns\WithChunkReading;
use Maatwebsite\Excel\Concerns\WithCustomCsvSettings;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Events\AfterImport;
use Maatwebsite\Excel\Events\BeforeImport;

class OrderAddressImport implements
    WithHeadingRow,
    ToModel,
    WithBatchInserts,
    WithChunkReading,
    WithCustomCsvSettings,
    ShouldQueue,
    WithEvents
{
    use Importable, RegistersEventListeners;

    protected $order;

    public function __construct(Order $order)
    {
        $this->order = $order;
    }

    /**
     * <strong i="16">@param</strong> array $row
     * <strong i="17">@return</strong> Address
     */
    public function model(array $row)
    {
        $data = ['order_id' => $this->order->id];
        $data = array_merge($data, $row);

        return new Address($data);
    }


    public function batchSize() : int
    {
        return 1000;
    }

    public function chunkSize() : int
    {
        return 5000;
    }

    /**
     * <strong i="18">@return</strong> array
     */
    public function getCsvSettings(): array
    {
        return [
            'delimiter' => ';',
            'enclosure' => '',
            'input_encoding' => 'UTF-8'
        ];
    }

    public static function afterImport(AfterImport $event)
    {
       dd($event);
    }
}

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

๋‹ค์Œ ๋ฆด๋ฆฌ์Šค (ํ˜„์žฌ 3.1-dev)๋Š” ์ฒญํฌ ์ฝ๊ธฐ๋ฅผ์œ„ํ•œ Before / AfterImport ์ด๋ฒคํŠธ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฒญํฌ ์ž‘์—…์ด ์‹คํŒจ ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ImportFailed ์ด๋ฒคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. (https://twitter.com/patrickbrouwers/status/1114166252711415808)

3.1 ๋ธŒ๋žœ์น˜์—์„œ ์ž์œ ๋กญ๊ฒŒ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์˜ˆ์™ธ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”.

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

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. WithChunkReading ๊ณ„์•ฝ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ AfterImport ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๋Š” BeforeImport ์ด๋ฒคํŠธ์—๋„ ํ•ด๋‹น๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ๊ฐ„๋žตํžˆ ์‚ดํŽด ๋ดค๋Š”๋ฐ ChunkReader ํด๋ž˜์Šค์—์„œ์ด ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ฝ”๋“œ๋ฅผ ์ „ํ˜€ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ๋•Œ ์ด๊ฒƒ์— ๋Œ€ํ•œ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์€ ์—†์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ํ•ด๊ฒฐ์ฑ…์€ afterImport ๋ฉ”์†Œ๋“œ๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋‹จ์ผ ์ž‘์—…์„ ์ฒด์ธ์— ๊ด‘๊ณ ํ•˜๋Š” ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ๋‹ต์ด ์žˆ์Šต๋‹ˆ๊นŒ? :)

์˜ˆ, ๋ฒ„๊ทธ๋กœ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ–ฅํ›„ ๋ฒ„์ „์—์„œ ์ด์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

@GlennM ์ด๋ ‡๊ฒŒ ๋งํ•˜๋ฉด์„œ, BeforeChunk ๋ฐ AfterChunk ์ด๋ฒคํŠธ๋„ ๊ตฌํ˜„ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ง„ํ–‰ ์ƒํ™ฉ์˜ ํ”„๋ŸฐํŠธ ์—”๋“œ GUI๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ... ์ด๊ฒƒ์œผ๋กœ ๊ณ ๋ คํ•  ์‚ฌํ•ญ , ์ด ๊ฐœ์ˆ˜ + ์ด ์ฒญํฌ + ํ˜„์žฌ ์ฒญํฌ (์ƒ๊ฐ์„์œ„ํ•œ ๊ฒƒ) ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํŒŒ์ผ์€ GUI๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰๋˜์ง€๋งŒ ์ƒ๋‹นํžˆ ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ์ข…๋ฅ˜์˜ "์ง„ํ–‰ ์ค‘"์„ ์ค„ ์ˆ˜์žˆ๋Š” ๊ฒƒ์ด ๋ถˆํ™•์‹คํ•œ ๊ฒƒ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค. ์ง„ํ–‰ ํ‘œ์‹œ ์ค„

BeforeChunk ๋ฐ AfterChunk ์‚ฌ์šด๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

BeforeImport / AfterImport๋Š” ๋” ๊นŒ๋‹ค ๋กญ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ฒด์ธ์— 2 ๊ฐœ์˜ ์ถ”๊ฐ€ ์ž‘์—…์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด ํŒŒ์ผ์„ 2 ๋ฐฐ ๋‹ค์‹œ ์—ด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ข‹์€ ์˜ต์…˜์€ ์ฒซ ๋ฒˆ์งธ ์ž‘์—…์—์„œ beforeimport๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋งˆ์ง€๋ง‰ ์ž‘์—…์—์„œ afterimport๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๊ฐ€๋Šฅํ•œ์ง€ ๋ณผ๊ฒŒ์š”.

์ฒญํฌ ์ž‘์—…์— BeforeImport / AfterImport ์ด๋ฒคํŠธ ์ถ”๊ฐ€์— +1. ๋‚˜๋Š” ์ด๊ฒƒ๋“ค์„ ์ฒด์ธ์— ๋‘ ๊ฐœ์˜ ์ง์—…์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ธฐ์œ„ํ•œ ์ œ์•ˆ์„ ์ œ์ถœํ•˜๋ ค๊ณ ํ–ˆ์ง€๋งŒ, ๋‹น์‹ ์ด ์ด๋ฏธ ๊ทธ๊ฒƒ์„ํ•˜๊ณ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋„ค์š”! ์ฒซ ๋ฒˆ์งธ ์ž‘์—…๊ณผ ๋งˆ์ง€๋ง‰ ์ž‘์—…์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋ผ๋Š” ์ œ์•ˆ์€ ๊ฐ€๋Šฅํ•˜๋ฉด ๊ฐ€์žฅ ์ž˜ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

AfterImport๋Š” ShouldQueue ๋ฐ WithChunkReading์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ํ์— ํ•„์š”ํ•˜๋ฏ€๋กœ ํ ์‹คํ–‰ ์ข…๋ฃŒ์‹œ ์ด๋ฒคํŠธ๊ฐ€ ๊ตฌํ˜„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ ์ œ์•ˆ :

$ import-> queue ( 'users.xlsx')-> chain ([
์ƒˆ๋กœ์šด NotifyUserOfCompletedImport (์š”์ฒญ ()-> ์‚ฌ์šฉ์ž ()),
]);

๊ฐ ๋Œ€๊ธฐ์—ด ํ•ญ๋ชฉ์€ ๋‹ค์Œ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. NotifyUserOfCompletedImport

Alguma sugestรฃo?

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ์— ๋ถ€๋”ช์ณค๋‹ค. ShouldQueue๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ž‘์—…์„ ๋งŒ๋“  ๋‹ค์Œ ์—ฌ๊ธฐ์—์„œ ๊ฐ€์ ธ ์˜ค๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฐ€์ ธ ์˜ค๊ธฐ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ ํ•„์š”ํ•œ ์ž‘์—… (๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด afterImport ์ด๋ฒคํŠธ์— ์žˆ์Œ)์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์ ธ ์˜ค๊ธฐ๋Š” ๋ฐฐ์น˜ ์‚ฝ์ž… ๋ฐ ์ฒญํฌ ์ฝ๊ธฐ๋ฅผ ๊ตฌ์„ฑํ–ˆ์œผ๋ฉฐ ์ž‘์—…์—์„œ ๋™๊ธฐ์‹์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์œ„์˜ ์ด์  ์ค‘ ํ•˜๋‚˜๋Š” ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ํ ์ž‘์—…์ž๋ฅผ ์‰ฝ๊ฒŒ ์ œ์–ด ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ (๋งค์šฐ ์ค‘์š”ํ•œ) ์ด์ ์€ ๋Œ€๊ธฐ์ค‘์ธ ์ž‘์—…์œผ๋กœ XLS ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Import ํด๋ž˜์Šค ์ž์ฒด์—์„œ ShouldQueue๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ‘œ์ค€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜‘๊ฐ™์€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค .ใ€‚ใ€‚ใ€‚ ์–ด๋–ป๊ฒŒํ•˜๋ฉด ...

@patrickbrouwers์—์„œ ์—…๋ฐ์ดํŠธ ๋œ ๋ฌธ์„œ์™€ zxl2006001 @ ๋‚˜๋Š”์ด ๋…ผ๋ฆฌ๋ฅผ ๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

(new UsersImport)->queue('users.xlsx')->chain([
    new NotifyUserOfCompletedImport(request()->user()),
]); 

์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค : https://docs.laravel-excel.com/3.1/imports/queued.html#appending -jobs

ํ˜„์žฌ ๋””์ž์ธ์—๋Š” ์‹ค์ œ๋กœ ๋‘ ๊ฐ€์ง€ ๊ฒฐ๊ณผ๊ฐ€ ๋” ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Reader ํด๋ž˜์Šค read ๋ฉ”์„œ๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์™œ beforeImport๊ฐ€ ChunkReader ์ฝ๊ธฐ๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ „์— ๋™ ๊ธฐ์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋Œ€์‹  beforeReading ๋‚ด์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  2. ์ฒญํฌ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์•Œ๋ฆผ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์—…์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ "currentFile"์†์„ฑ์ด ๋ณดํ˜ธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ž„์‹œ ํŒŒ์ผ์„ ์ ์ ˆํ•˜๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ReadChunk ์ดํ›„์— ์—ฐ๊ฒฐ๋œ ์ž‘์—…์€ afterImport์™€ ์ž„์‹œ ์ •๋ฆฌ.

์‹คํŒจํ•œ ๊ฐ€์ ธ ์˜ค๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ์œ„ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ํ˜„์žฌ ์ƒ๊ฐํ•  ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ laravels ์ „์—ญ ์ž‘์—… ์˜ค๋ฅ˜ ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ ๋ฌธ์ œ๋Š” aatwebsiteExcel \ Jobs \ ReadChunk ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ์–ด ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์‹คํŒจํ•œ ์ž‘์—…์— ๋Œ€ํ•ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์—ญ ์ด๋ฒคํŠธ์— ์ „๋‹ฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

chunkSize๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์˜ค๋ฅ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๊นŒ?

๋‹ค์Œ ๋ฆด๋ฆฌ์Šค (ํ˜„์žฌ 3.1-dev)๋Š” ์ฒญํฌ ์ฝ๊ธฐ๋ฅผ์œ„ํ•œ Before / AfterImport ์ด๋ฒคํŠธ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฒญํฌ ์ž‘์—…์ด ์‹คํŒจ ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ImportFailed ์ด๋ฒคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. (https://twitter.com/patrickbrouwers/status/1114166252711415808)

3.1 ๋ธŒ๋žœ์น˜์—์„œ ์ž์œ ๋กญ๊ฒŒ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์˜ˆ์™ธ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”.

๊ฐ€์ ธ ์˜ค๊ธฐ์— database ๋Œ€๊ธฐ์—ด ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ฐ€์ ธ ์˜ค๊ธฐ ํด๋ž˜์Šค์—์„œ WithChunkReading ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด AfterImport ์ด๋ฒคํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํŠธ๋ฆฌ๊ฑฐํ•˜๋„๋ก ์ด์Œ์ƒˆ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์ž…๋‹ˆ๊นŒ?

database ๋Œ€๊ธฐ์—ด ๋“œ๋ผ์ด๋ฒ„ ๋ฐ ๋ฒ„์ „ 3.1 ์„ฑ๊ณต์ ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋งˆ๋‹ค AfterImport ์ด ๋‘ ๋ฒˆ ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

database ๋Œ€๊ธฐ์—ด ๋“œ๋ผ์ด๋ฒ„ ๋ฐ ๋ฒ„์ „ 3.1 ๋กœ๋„ ์„ฑ๊ณต์ ์œผ๋กœ ๊ฐ€์ ธ ์˜ค๊ธฐ๋ฅผ ์‹คํ–‰ ํ•œ ํ›„ AfterImport ์ด (๊ฐ€) ๋ฌด๊ธฐํ•œ ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ๊ฒฝํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

redis ํ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๊ฐ€์ ธ ์˜ค๊ธฐ์— ์‚ฌ์šฉํ•˜๊ณ  ๊ฐ€์ ธ ์˜ค๊ธฐ ํด๋ž˜์Šค์—์„œ WithChunkReading ์„ ๊ตฌํ˜„ํ•˜๋ฉด AfterImport ์ด๋ฒคํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํŠธ๋ฆฌ๊ฑฐํ•˜๋„๋ก ์ด์Œ์ƒˆ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์ž…๋‹ˆ๊นŒ?

๋‹ค์Œ์€ ์˜ค๋ฅ˜ ๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.

local.ERROR: unlink(/Users/sineld/Code/project/public/uploads/tmp/laravel-excel-qfK6O5aCHxhFXioVayQbLQag5UnFKyxB.xlsx): No such file or directory {"exception":"[object] (ErrorException(code: 0):

๊ทธ๋…€์˜ AfterImport๋„ ๋‘ ๋ฒˆ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ AfterImport ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋‘ ๋ฒˆ ํ˜ธ์ถœ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. xdebug๋กœ ๋””๋ฒ„๊น… ํ•œ ํ›„ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋‘ ์œ„์น˜์— ๋“ฑ๋ก๋˜์–ด ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ฆด๋ฆฌ์Šค๋ฅผ ์œ„ํ•ด ์ˆ˜์ • ๋จ

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