当我尝试导入文件时,Laravel 8 应用程序出现序列化错误

我正在使用 Laravel 8 开发管理应用程序。

在应用程序中,我有一个导入表单,用于导入结构类似于 CSV 的 .txt 类型的文件,并且对于每一行,字段由 ; 字符分隔。

行示例:field_1;field_2;field_3;.....;field_n;\n

当我从表单接收文件时,我根据文件类型执行操作,特别是通过检查文件名的前两个字符,然后在文件行上循环并调用保存在DB(取决于文件类型)。

我的问题如下......当我尝试导入 raccomandate 然后调用 importRaccomandate($file) 方法,该方法又调用 salvaRaccomandata($line) 我没有收到错误并且过程成功,而当我尝试保存 AG 文件时,我收到错误 Serialization of 'Illuminate\Http\UploadedFile' is not allowed

这两种文件在结构上是一样的,即如.txt所说,字段之间用;分隔,在控制器中的操作是一样的,但是是根据文件类型定制的。 我不知道为什么我有这种行为,这两种类型的导入都不应该出错吗? 您有什么提示或建议吗?

编辑:

在执行其他测试时,raccomandata 的导入仅在第一次成功,如果我随后尝试导入新文件,在这种情况下也会出现序列化错误。

这是我的代码:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Caricamenti;
use App\Models\CodiceRaccomandata;
use App\Models\TipoRaccomandata;
use App\Models\TipoServizio;
use App\Models\Raccomandata;
use App\Models\RaccomandataVariabili;
use App\Models\EsitiRaccomandata;
use App\Models\CodiciPrenotazione;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Facades\Excel;



class ImportController extends Controller
{
    // mostriamo il form per l'import del tracciato
    public function showImportForm()
    {

        $page_title = 'Import tracciati ritiro digitale';
        $page_description = 'Pagina per l\'import dei tracciati';
        $logo = config('dz.public.logo');
        $logoText = config('dz.public.logo_text');
        $active = "active";
        $action = 'dashboard_4';

        return view('importa.importa-form',compact('page_title','page_description','logo','logoText','active','action'));
    }

    // prendiamo in gestione l'import del file
    public function gestisciImport(Request $request)
    {

        try {

            set_time_limit(-1);

            $validati = $request->validate([
                'file' => 'required|mimes:csv,xlsx,txt','note' => 'required',]);

            $file = $request->file('file');
            $base_name = $request->file('file')->getclientOriginalName();

            $name = $base_name;
            $counter = 1;


            // file con lo stesso nome sono rinominati 'name<n>'in base al numero di volte <n> che il ciclo è eseguito
            // data la diversa estensione dei file customizzo il substr_replace
            while (file_exists(storage_path('uploaded_files/files/') . $name)) {
                $name = substr_replace($base_name,' (' . $counter++ . ')',(substr($base_name,2) == 'RA') ? -4 : -4,0);
            }


            $results = $this->inizializzaImport($file,$request->input('tipo_file'));
            // Salvo sul disco in uploaded_files/files/<nome_file>
            $path = $file->storeAs('files',$name,'uploadedfiles');
            //memorizziamo le info del file nel DB
            $caricamento = new Caricamenti;

            $caricamento->nome_file = $name;
            $caricamento->file_path = $path;
            $caricamento->note = $request->input('note');
            $caricamento->tipo_caricamento = $request->input('tipo_file');
            $caricamento->save();

            Log::channel('custom_log')->info('L\'utente ' . Auth::user() . ' ha caricato con successo sul DB il file' . $name . ' ( ' . $file->getSize() . ' bytes )');

            $caricamenti = Caricamenti::get();

            return redirect()->back()
                ->with('caricamenti',$caricamenti)
                ->with('results',$results);
        } catch (\Exception $e) {

            Log::channel('custom_log')->info('L\'utente ' . Auth::user() . ' non è riuscito a caricare sul DB il file' . $name . ' ( ' . $file->getSize() . ' bytes ) [errore: ' . $e . ']');

            return redirect('/importa')->with('error','Non è stato possibile caricare il file ' . $name . ' sul DB!');
        }
    }

    // prendiamo in gestione l'import del tracciato
    public function inizializzaImport($file,$tipo_file)
    {
        // Da sistemare a seconda dei file che dobbiamo importare
        switch ($tipo_file) {
            case 'RA':
                return $this->importRaccomandate($file);
            case 'AG':
                return $this->importEsitiAG($file);
            case 'AR':
                return $this->importEsiti($file);
            case 'EE':
                return $this->importEsiti($file);
            default:
                return false;
        }
    }

    // funzione richiamata quando il file è di tipo raccomandata ( AR o AG )
    public function importRaccomandate($file)
    {
       
    }

    // funziona richiamata quando il file è di tipo esito ( AR,EE )
    public function importEsiti($file)
    {
    }

    //funzione richiamata quando il file è di tipo esiti ( AG )
    public function importEsitiAG($file)
    {

        //eseguiamo un try catch
        try {

            set_time_limit(-1);

            // i tracciati delle raccomandate sono .TXT quindi gestisco il file a mano per l'import
            if (substr($file->getclientOriginalName(),2) == 'AG') {

                // apro il file in lettura e lo memorizzo nella variabile $file
                $opened_file = fopen($file,'r');

                fgets($opened_file,1024);

                //ciclo sulle linee del file finchè feof — Tests for end-of-file on a file pointer
                while (!feof($opened_file)) {

                    //esplodo la linea in un array,l'esplosione è fatta per il carattere ;
                    $line = explode(';',fgets($opened_file,1024));

                    //passo alla funzione la linea da memorizzare nel DB
                    $this->salvaEsitiAG($line);
                }

                // chiudo il file dalla lettura
                fclose($opened_file);

                //mettere il return back e 
            } else {

                //caso di tracciato non corretto

                Log::channel('custom_log')->info('L\'utente ' . Auth::user() . ' ha provato a caricare il tracciato : ' . $file->getclientOriginalName() . ' ( ' . $file->getSize() . ' bytes ),[ errore: Formato del tracciato non corretto ]');

                return redirect()->back()->with('error','Formato di tracciato non corretto! Controlla il tracciato e riprova l\'import! ');
            }
        } catch (\Exception $e) {

            Log::channel('custom_log')->info('L\'utente ' . Auth::user() . ' ha provato il caricamento del tracciato : ' . $file->getclientOriginalName() . ' ( ' . $file->getSize() . ' bytes ),[ errore: ' . $e . ' ]');

            return redirect()->back()->with('error','Errore nel caricamento del tracciato');
        }
    }



    // funzioni per lo storage della singola riga sul DB  ( raccomandate e/o esiti )
    private function salvaRaccomandata($line)
    {
        
    }

    private function salvaEsiti()
    {
    }

    private function salvaEsitiAG($line)
    {
        //dd($line);
        $esito = new EsitiRaccomandata;

        $esito->id_raccomandata = 1;
        $esito->numero_cartella = $line[1];
        $esito->nome_file = $line[2];
        $esito->data_ricezione = ($line[3] != "") ? $line[3] : null;
        $esito->data_mancata_ricezione = ($line[4] != "") ? $line[4] : null;
        $esito->motivo_mancata_ricezione = ($line[5] != "") ? $line[5] : null;
        $esito->scatola  = $line[6];
        $esito->lotto = $line[7];
        $esito->posizione = $line[8];
        $esito->emessoCAD = ($line[9] != "") ? (($line[9] == "SI") ? 1 : 0) : null;
        $esito->emessoCAN = ($line[10] != "") ? (($line[10] == "SI") ? 1 : 0) : null;
        $esito->visto_arrivare = $line[11];
        $esito->errore_poste = $line[12];
        $esito->non_ritirato_10 = ($line[13] != "") ? $line[13] : null;

        $esito->save();
    }


    public function gestisciCodici(Request $request)
    {

        try {

            set_time_limit(-1);

            if ($request->input('tipo_file') == 'CP') {
                $file = $request->file('file');

                //apro il file in lettura
                $opened_file = fopen($file,'r');

                //rimuovo la riga di intestazione del file
                fgets($opened_file,1024);

                while (!feof($opened_file)) {
                    //$line = fgets($opened_file,1024);
                    $line = explode(';',1024));

                    $this->salvaCodici($line);
                }
                //dd('File chiuso');
                fclose($opened_file);
            }

            Log::channel('custom_log')->info('L\'utente ' . Auth::user() . ' ha caricato correttamente il tracciato  : ' . $file->getclientOriginalName() . ' ( ' . $file->getSize() . ' bytes ),dei codici di prenotazione');

            return redirect()->back()->with('success','Codici di prenotazione caricati correttamente');
        } catch (\Exception $e) {

            Log::channel('custom_log')->info('L\'utente ' . Auth::user() . ' ha provato il caricamento dei codici di prenotazione : ' . $file->getclientOriginalName() . ' ( ' . $file->getSize() . ' bytes ),'Errore nel caricamento del tracciato dei codici prenotazione');
        }
    }

    private function salvaCodici($line)
    {

        if (isset($line[1])) {
            $cp = new CodiciPrenotazione;

            $cp->id_caricamento = ($line[0] == "") ? null : $line[0];
            $cp->codice = isset($line[1]) ? $line[1] : 0;
            $cp->data_prenotazione = ($line[2] == "") ? null : $line[2];
            $cp->stato = $line[3];

            $cp->save();
        }
    }
}

hubeihb 回答:当我尝试导入文件时,Laravel 8 应用程序出现序列化错误

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/23780.html

大家都在问