avoir du mal à télécharger des fichiers en utilisant Laravel sur le back-end.
La méthode Laravel $request->file()
renvoie null.
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.
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.
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!