我正在使用一个使用带有多个文件输入的表单的Laravel项目。如果我提交表单,第一个输入为空,所有其他输入为文件,则hasFile返回false。如果第一个输入包含文件,它将仅返回true。
if(Input::hasfile('file'))
{
// do something
}
这是通过Input :: file(' file)输入的数组。小图像输入为空,但大图像不是。我希望看看整个数组,如果有任何文件存在,那么继续执行"做一些事情"。
Array
(
[small] =>
[large] => Symfony\Component\HttpFoundation\File\UploadedFile Object
(
[test:Symfony\Component\HttpFoundation\File\UploadedFile:private] =>
[originalName:Symfony\Component\HttpFoundation\File\UploadedFile:private] => image_name.jpg
[mimeType:Symfony\Component\HttpFoundation\File\UploadedFile:private] => image/jpeg
[size:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 44333
[error:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 0
[pathName:SplFileInfo:private] => /Applications/MAMP/tmp/php/phpHILgX2
[fileName:SplFileInfo:private] => phpHILgX2
)
)
这是预期的行为吗?或者,它应该看整个阵列吗?
答案 0 :(得分:5)
您可以使用数组键进行检查,例如: HTML输入类型文件元素:
<input type="file" name="your_file_name[]" />
Laravel 5:$request->hasFile('your_file_name.'.$key)
Laravel 4.2:Input::hasFile('your_file_name.'.$key)
答案 1 :(得分:4)
摘自来源:
/**
* Determine if the uploaded data contains a file.
*
* @param string $key
* @return bool
*/
public function hasFile($key)
{
if (is_array($file = $this->file($key))) $file = head($file);
return $file instanceof \SplFileInfo;
}
它似乎只检查数组中的第一个,head
返回数组中的第一个项。
答案 2 :(得分:3)
这是一个可能有用的代码段
if(Input::hasFile('myfile')){
$file = Input::file('myfile');
// multiple files submitted
if(is_array($file))
{
foreach($file as $part) {
$filename = $part->getClientOriginalName();
$part->move($destinationPath, $filename);
}
}
else //single file
{
$filename = $file->getClientOriginalName();
$uploadSuccess = Input::file('myfile')->move($destinationPath, $filename);
}
} else {
echo 'Error: no file submitted.';
}
答案 3 :(得分:1)
由于我无法发表评论,因此似乎必须发表。
罗纳克·沙(Ronak Shah)的答案确实应该在这里标记为正确的答案,当我弄清楚原因时,它在试图弄清楚这个……“混乱”的30至40分钟后立即让我说“ Sonnofa--”。
结果是在输入数组上使用hasFile(),需要使用点表示法。
所以(使用我自己的示例)而不是
$request->hasFile("img[29][file]")
它必须是
$request->hasFile("img.29.file")
这肯定使人大开眼界,因为PHP和点表示法并没有真正并存。输入数组确实是有问题的孩子。
答案 4 :(得分:0)
在撰写本文时 (Laravel 8),Request
类现在支持 array
的 hasFile
方法,从 source code 开始:
/**
* Determine if the request contains the given file.
*
* @param string $name
* @param string|null $value
* @param string|null $filename
* @return bool
*/
public function hasFile($name, $value = null, $filename = null)
{
if (! $this->isMultipart()) {
return false;
}
return collect($this->data)->reject(function ($file) use ($name, $value, $filename) {
return $file['name'] != $name ||
($value && $file['contents'] != $value) ||
($filename && $file['filename'] != $filename);
})->count() > 0;
}