web-dev-qa-db-fra.com

Laravel $ request-> file () renvoie null

avoir du mal à télécharger des fichiers en utilisant Laravel sur le back-end.

Problème

La méthode Laravel $request->file() renvoie null.

Installer

Je crée une AJAX en utilisant superagent , j'ai débogué la demande et tout semble correct. Le Content-Length Change en fonction de l'image que j'ajoute, indiquant un l'image a été ajoutée à la demande. Content-Type est également défini sur multipart/form-data.

// request headers
Content-Length:978599
Content-Type:multipart/form-data; 

// request payload
Content-Disposition: form-data; name="files"; filename="item-keymoment.png"
Content-Type: image/png

Mais je ne parviens pas à obtenir le fichier dans Laravel. L'utilisation de $request->file('files') renvoie NULL, mais si je débogue le tableau $_FILES, J'ai remarqué qu'un fichier a été téléchargé.

dd($request->file('files'))
// NULL

dd($_FILES);
// array:1 [
//   "files" => array:5 [
//     "name" => "item-keymoment.png"
//     "type" => "image/png"
//     "tmp_name" => "/tmp/phpipbeeM"
//     "error" => 0
//     "size" => 978274
//   ]
// ]

dd($request->files->all())
// []

Qu'est-ce qui pourrait amener Laravel à ignorer le fichier?
Content-Type Du fichier d'entrée n'est pas application/octet-stream?

Ci-dessous ont répondu à la question.

16
Renārs Vilnis

A remarqué que le $request l'objet que je recevais dans la méthode Controller était une instance de JsonRequest, qui est une classe personnalisée ( vide pour l'instant ) qui étend Illuminate\Http\Request.

Et il est implémenté comme:

<?php

namespace App\Http\Requests;

use Illuminate\Http\Request;

class JsonRequest extends Request {
}

Mais si je change:

// from
use App\Http\Requests\JsonRequest;
public function add_background_image (JsonRequest $request) {
  dd($request->file('files'))
  // NULL
}

// to
use Illuminate\Http\Request;
public function add_background_image (Request $request) {
  dd($request->file('files'))
  // UploadedFile {#266
  //   -test: false
  //   -originalName: "item-keymoment.png"
  //   -mimeType: "image/png"
  //   -size: 978274
  //   -error: 0
  //   ...
  // }
}

J'obtiens le fichier d'entrée souhaité. Pour l'instant, changer l'instance de $request résout mon problème

Mais je ne comprends pas pourquoi/comment étendre Illuminate\Http\Request avec une classe vide casse les choses.
Quelqu'un peut-il expliquer?

Mon intention de sous-classer Illuminate\Http\Request devait pouvoir attacher des méthodes sur $requests pour traiter les exceptions/erreurs de manière unifiée pour les demandes d'API. Par exemple, lors du déploiement, afficher des messages d'exception, mais en production, renvoyer un message fixe.
Y a-t-il une manière différente/meilleure/plus Laravel façon de le faire?
Je pense qu'il suffit de créer un JsonController au lieu d'étendre Request.

4
Renārs Vilnis

Vous devez ajouter à la balise de formulaire 'enctype = "multipart/form-data'

Par exemple:

<form method="POST" action="{{route('back.post.new')}}" enctype="multipart/form-data">
......
</form>

En l'ajoutant, vous pouvez utiliser votre demande personnalisée.

J'espère que cela peut vous aider!

28
CarlosYanes