7 votes

Comment stocker un fichier sur le système de stockage local ?

J'essaie de télécharger un fichier dans un emplacement temporaire avec Laravel Storage Facade et il me dit que le fichier n'existe pas. J'essaie de télécharger le fichier dans ./storage/app/roofing/projects/{id}/ puis le fichier. Je ne sais pas exactement où je me trompe.

foreach ($files as $file) {
    $path = Storage::putFile('contract-assets', new File('../storage/app/roofing/projects/'. $project->id.'/'. $file));
}

Je dois envoyer le fichier après l'avoir stocké sur mon serveur local vers AWS S3 en raison du temps qu'il faut pour essayer de télécharger directement vers S3 et, dans mon cas, cela prend du temps en raison du nombre de fichiers devant être stockés. Pour l'instant, tout ce que je reçois en retour est true dans mon dd(). Quelle pourrait en être la cause ?

if (!empty($request->contract_asset)) {
    $files = $request->file('contract_asset');
    foreach ($files as $file) {
        Storage::putFile(Carbon::now()->toDateString().'/roofing/projects/'. $project->id.'/contract-assets', $file);
    }
}

foreach (Storage::files(Carbon::now()->toDateString().'/roofing/projects/'.$project->id.'/contract-assets') as $file) {
    dispatch(new ProcessRoofingProjectContractAssets($file, $project));
}

Mon dossier d'emploi.

/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
    $path = Storage::disk('s3')->put('contract-assets', $this->asset, 'public');
    dd($path);
    $this->project->addContractAsset($path);    
}

UPDATE :

Ce sont mes modifications actuelles et je reçois le message d'erreur suivant. Failed because Unable to JSON encode payload. Error code: 5

foreach ($files as $file) {
    $returnedStoredFile = Storage::putFile('/roofing/projects/' . $project->id . '/contract-assets/'.Carbon::now()->toDateString(), $file);
    dispatch(new ProcessRoofingProjectContractAssets(Storage::get($returnedStoredFile), $project));
}

4voto

Diogo Sgrillo Points 1454

Vous ne devriez pas passer un fichier entier en paramètre de votre Job. Laravel va le sérialiser, et cela serait extrêmement inefficace en termes de mémoire. (C'est probablement pendant cette sérialisation que vous avez ce problème maintenant - Échec car Impossible d'encoder la charge utile en JSON. Code d'erreur : 5 )

Je suppose que vous n'avez pas de problème pour télécharger dans le dossier temporaire, et que vous avez des problèmes pour distribuer le travail (ou exécuter le travail).

Modifiez votre travail pour recevoir un chemin d'accès au fichier comme paramètre. Ce n'est qu'au cours de l'exécution du travail que vous irez sur le disque pour le lire.

Envoi du travail :

foreach ($files as $file) {
    $returnedStoredFile = Storage::putFile('/roofing/projects/' . $project->id . '/contract-assets/'.Carbon::now()->toDateString(), $file);
    dispatch(new ProcessRoofingProjectContractAssets($returnedStoredFile, $project));
}

Et l'exécuter :

/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
    $file = Storage::get($this->asset);
    $path = Storage::disk('s3')->put('contract-assets', $file, 'public');
    dd($path);
    $this->project->addContractAsset($path);    
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X