合并请求不能正常工作
问题描述:
我试图用映像文件名替换'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);
什么想法?
答
你不能轻易摆脱文件。这里的问题很复杂,但我会尽力解释。
因此,基本上每次初始化请求并尝试从中获取数据时,请求都会将所有文件转换并将其存储在受保护的数组中。
然后,当您请求->all()
时,它会递归合并所有纯文本输入和文件输入,因此如果您使用纯文本输入名称pic
和文件名称pic
,文件比纯文本输入具有更高的显示优先级。
现在脏了廉价的解决方案:从原始请求属性
$request = new Request($request->all());
$request->merge(['pic' => 'zzz']);
dd($request->all());
形成新的要求,那么你的新请求将不会有任何文件,所以你可以很容易地合并任何你需要它。
因此得出结论:一旦您尝试从请求访问ANY值,它会将文件保存在受保护的数组中,并且现在无法将其移除。
但是,如果您有任何干净的请求,但没有任何先前的访问权限,您可以通过编写以下行轻松删除它们:$request->files = collect();
工作正常!非常感谢。只要我赚取更多的代表积分,我就会提高你的答案。 你能指点我的任何文档,为什么他们在访问请求后将文件保存在受保护的数组中?我想知道这是为什么。 – roerjo
@roerjo你不能在文档中找到这些东西,你必须自己挖掘。基本上,这是问题https://github.com/laravel/framework/blob/eedb619baa97105901d7256166df8875afd71c59/src/Illuminate/Http/Request.php#L433因为'$ convertedFiles'是受保护的变量,所以你不能改变它容易。 –