我正在尝试上传文件(它们可以是任何类型),我在以某种方式上传文件时遇到问题。
我可以使用$request->file('file_name')
和Storage::disk($disk)->put($path, $file);
正确上传文件。但是,$file
参数只能通过$request->file('file_name')
。
但是,由于我想用多个文件上传多个订单的方式如下:
控制器
foreach ( $filesArray as $key => $files ) {
$path = 'order/'.$order->id;
if ( isset($files[$i]) && !empty($files[$i]) ) {
for ( $j = 0; $j < count($files[$i]); $j++ ) {
$uploadedFile = FileHelper::upload($files[$i][$j], $path);
$orderFile = [];
$orderFile['order_id'] = $order->id;
$orderFile['file_id'] = $uploadedFile->id;
OrderFileModel::create($orderFile);
}
}
}
FileHelper
static public function upload($file, $path, $disk = 's3')
{
$fileOrm = new FileModel;
$fileOrm->size = $file->getSize();
$fileOrm->extension = $file->getExtension();
$fileOrm->bucket_name = self::$BUCKET_NAME;
$fileOrm->type = self::getFileType($file->getExtension());
$fileOrm->key = Storage::disk($disk)->put($path, $file);
$fileOrm->created_time = now();
$fileOrm->save();
return $fileOrm;
}
我还附上了我看到差异的图片。
一个使用$request->file('file_name')
,另一个只使用$request->file_name
,这是blob类型。
下面的图片会返回错误fstat() expects parameter 1 to be resource, object given
我怎么能解决这个问题?
任何建议或建议都将不胜感激。谢谢。
答案 0 :(得分:2)
实际上只需在您的输入文件中添加一个数组
<input type="file" name="files[]">
<input type="file" name="files[]">
<input type="file" name="files[]">
<input type="file" name="files[]">
注意:您需要在表单中启用enctype =“multipart / form-data”。
然后在您的控制器中,您可以通过执行此操作来循环输入文件
foreach($request->file('files') as $index => $file){
// do uploading like what you are doing in your single file.
}
答案 1 :(得分:2)
您是否获得了使用$request->files
的文件列表?如果您这样做,请更改为$request->allFiles()
。此方法会将File
对象转换为UploadedFile
对象。
答案 2 :(得分:0)
尝试:
$this->validate($request, [
'files.*' => 'file|mimes:...'
]);
foreach ($request->files as $file) {
$fileName = (string)Str::uuid() . '.' . $file->getClientOriginalExtension();
try {
if (\Storage::disk('s3')->put($fileName, file_get_contents($file))) {
FileModel::create([
'size' => '...',
'extension' => '...',
'bucket_name' => '...',
'type' => '...',
'key' => '...',
'created_time' => '...'
]);
}
} catch (\Exception $e) {
// ...
}
}
答案 3 :(得分:0)
你可能幸运的是,你的$ image对象上的某些类型转换产生了一个字符串,我猜你最后一行的简单版本
$disk->put($path, $file->__toString());
将解决问题并且更安全,因为“put”方法正式只接受字符串(并且查看implmentation也是php资源)。从长远来看,这应该让你与变化兼容。