laravel 合并请求不工作

qrjkbowd  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(101)

我试图用图像文件名替换“pic”值,当它进来时它被设置为一个数组,但合并似乎不起作用。
我没有得到任何错误的日志与下面的代码。我想我还没有被允许嵌入图片,所以下面有链接。我正在做一个Laravel项目。

Log::info($request);

$image = $request->file('pic');
$imageName = $image->getClientOriginalName();

$request->merge(array('pic' => $imageName));
$request->file('pic')->move(base_path()."/public/profile_pics",$imageName);

Log::info($request);

Laravel Log
有什么想法?

qeeaahzv

qeeaahzv1#

你不能这么轻易地删除文件。这里的问题很复杂,但我会尝试解释。
因此,基本上每次初始化请求并尝试从中获取数据时,请求将转换所有文件并将其存储在受保护的数组中。
然后当你请求->all()时,它递归地合并所有纯文本输入和文件输入,所以如果你有名为pic的纯文本输入和名为pic的文件,文件有更高的优先级显示,而不是纯文本输入。
现在肮脏的廉价解决方案:

$request = new Request($request->all());
    $request->merge(['pic' => 'zzz']);
    dd($request->all());

形成新的请求与属性从原来的请求,然后您的新请求将不会有任何文件,所以你可以很容易地合并任何你需要在它。
总结一下:一旦你试图从请求中访问任何值,它将保存文件在受保护的数组中,现在没有办法删除它们。
但如果你有干净的请求,没有任何以前访问它,你可以很容易地删除它们通过写这行:$request->files = collect();

avwztpqn

avwztpqn2#

您也可以使用下面的simple方法:

$image = $request->file('pic');
$imageName = $image->getClientOriginalName();
$newArray = array_merge($request->except('pic'), ['pic' => $imageName]);
$request->file('pic')->move(base_path()."/public/profile_pics",$imageName);

Log::info($$newArray);  //You have all the inputs except 'pic'

现在你可以使用newArray来创建新的模型。

sulc1iza

sulc1iza3#

您也可以通过将请求数据保存在数组中并将key转换为该数组来实现此目的

$data = $request->all();
//Your file uploading works.
$imageName = $uploadedFile->name;
$data['image'] = $imageName;

dd($data);
//A more better way should be validating image and use 
$validated = $request->validated();
$validated['image'] = $imageName;

相关问题