Box \ Spout \ Common \ Exception \ IOException: не удалось открыть C: \ xampp \ htdocs \ projectname \ public \ uploads / для чтения! в C: \ - PullRequest
0 голосов
/ 20 июня 2020

Я получаю исключение при реализации очереди (заданий) для чтения данных и сохранения в базе данных из листа excel (пакет cyber-duck / laravel -excel), файл уже хранится на моем компьютере.

Исключение выглядит следующим образом:

Box\Spout\Common\Exception\IOException: Could not open C:\xampp\htdocs\eluminalearningtest\public\uploads/ for reading! (Could not open C:\xampp\htdocs\eluminalearningtest\public\uploads/ for reading.) in C:\xampp\htdocs\eluminalearningtest\vendor\box\spout\src\Spout\Reader\ReaderAbstract.php:130
Stack trace:
#0 C:\xampp\htdocs\eluminalearningtest\vendor\cyber-duck\laravel-excel\src\Importer\AbstractSpreadsheet.php(165): Box\Spout\Reader\ReaderAbstract->open('C:\\xampp\\htdocs...')
#1 C:\xampp\htdocs\eluminalearningtest\vendor\cyber-duck\laravel-excel\src\Importer\AbstractSpreadsheet.php(73): Cyberduck\LaravelExcel\Importer\AbstractSpreadsheet->open()
#2 C:\xampp\htdocs\eluminalearningtest\app\Jobs\BulkUploadJob.php(38): Cyberduck\LaravelExcel\Importer\AbstractSpreadsheet->getCollection()
#3 [internal function]: App\Jobs\BulkUploadJob->handle()
.
.
.

#38 C:\xampp\htdocs\eluminalearningtest\artisan(37): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#39 {main}

Контроллер (BulkUploadController), он используется для загрузки файла в место, откуда мы можем получить сбор данных из этого файла и отправить для отправки задания

public function store(Request $request)
    {
        $fileName = time() . '.' . $request->uplodedfile->extension();
        $upload_status = $request->uplodedfile->move(public_path('uploads'), $fileName);

        $excel = LaravelExcelImporterFacade::make('Excel');

        $file_path = public_path('uploads' . DIRECTORY_SEPARATOR . $fileName);

        BulkUploadJob::dispatch($file_path)->delay(now()->addSeconds(10));

        return back()->with('success', 'You have successfully uploaded file.')
            ->with('file', $fileName);
    }

Созданное задание (BulkUploadJob), оно использовалось для обработки данных файла Excel в нашей базе данных

<?php

namespace App\Jobs;

use App\Registration;
use Cyberduck\LaravelExcel\ImporterFacade;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class BulkUploadJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $path;

    public function __construct($path)
    {
        $path = $path;
    }

    public function handle()
    {
        // Cyberduck Facade for Importing file from provided path
        $excel = ImporterFacade::make('Excel');
        // Loading  file from local public path
        $excel->load(public_path('uploads/' . $this->path));
        // storing data in a collection variable
        $collection = $excel->getCollection();
        $batch = random_int(1111, 9999);
        foreach ($collection  as $reg) {
            if (is_numeric($reg[0])) {
                $registration = Registration::find($reg[0]);
                if (isset($registration)) {
                    registration->firstname = $reg[1];
                    $registration->save();
                } else {
                    $registration = new Registration();
                    $registration->id = $reg[0];
                    $registration->firstname = $reg[1];
                    $registration->save();
                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 23 июня 2020

Вышеупомянутая проблема теперь решена.

Если нам нужно обработать файл, нам нужно отправить коллекцию в очередь напрямую, потому что она все равно не будет читать путь к файлу.

Вместо указанного ниже пути от контроллера (BulkUploadController):

$file_path = public_path('uploads' . DIRECTORY_SEPARATOR . $fileName);

BulkUploadJob::dispatch($file_path)->delay(now()->addSeconds(10));

Пожалуйста, отправьте коллекцию непосредственно из контроллера (BulkUploadController) в очередь, как показано ниже:

$excel->load(public_path('uploads/' . $fileName)); 

$collection = $excel->getCollection(); 

BulkUploadJob::dispatch($collection)->delay(now()->addSeconds(10));

В методе обработки нашего задание (BulkUploadJob) будет выглядеть, как показано ниже:

public function handle()
    {
        $batch = random_int(1111, 9999);
        foreach ($this->collection as $collection) {
        //code to save the records in database
        }
    }

Наконец, задание работает нормально:)

...