合并请求不能正常工作

合并请求不能正常工作

问题描述:

我试图用映像文件名替换'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

什么想法?

你不能轻易摆脱文件。这里的问题很复杂,但我会尽力解释。

因此,基本上每次初始化请求并尝试从中获取数据时,请求都会将所有文件转换并将其存储在受保护的数组中。
然后,当您请求->all()时,它会递归合并所有纯文本输入和文件输入,因此如果您使用纯文本输入名称pic和文件名称pic,文件比纯文本输入具有更高的显示优先级。

现在脏了廉价的解决方案:从原始请求属性

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

形成新的要求,那么你的新请求将不会有任何文件,所以你可以很容易地合并任何你需要它。


因此得出结论:一旦您尝试从请求访问ANY值,它会将文件保存在受保护的数组中,并且现在无法将其移除。
但是,如果您有任何干净的请求,但没有任何先前的访问权限,您可以通过编写以下行轻松删除它们:$request->files = collect();

+0

工作正常!非常感谢。只要我赚取更多的代表积分,我就会提高你的答案。 你能指点我的任何文档,为什么他们在访问请求后将文件保存在受保护的数组中?我想知道这是为什么。 – roerjo

+0

@roerjo你不能在文档中找到这些东西,你必须自己挖掘。基本上,这是问题https://github.com/laravel/framework/blob/eedb619baa9​​7105901d7256166df8875afd71c59/src/Illuminate/Http/Request.php#L433因为'$ convertedFiles'是受保护的变量,所以你不能改变它容易。 –