我正在使用 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();
}
}
}