Laravel多文件上传

时间:2018-03-05 13:12:13

标签: laravel file laravel-5

我正在尝试上传文件(它们可以是任何类型),我在以某种方式上传文件时遇到问题。

我可以使用$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类型。

able to upload

not able to upload: with error fstat() expects parameter 1 to be resource, object given

下面的图片会返回错误fstat() expects parameter 1 to be resource, object given

我怎么能解决这个问题?

任何建议或建议都将不胜感激。谢谢。

4 个答案:

答案 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资源)。从长远来看,这应该让你与变化兼容。