Laravel多文件上传

4
我将尝试上传文件(可以是任何类型),但在某些方式上传文件时遇到了问题。
使用 $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);
        }
   }
}

文件助手

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
我该如何解决这个问题?
欢迎提供建议或意见。谢谢。

你能否重构fileHelper::upload方法以包含请求对象?或者,你能在上传方法中调用request()辅助方法吗?如果可以的话,你可以使用Laravel内置的文件处理程序 $path = $request->file('avatar')->store( 'avatars/'.$request->user()->id, 's3' ); 吗?否则,你需要使用类似于file_get_contents($files[$i][$j])的东西来获取临时文件的内容并手动处理它。 - j.steelman
@j.steelman感谢您的评论。我如何使用file_get_contents来获取内容?根据文档,file_get_contents需要在第一个参数中提供文件名,但是$files[$i][$j]是一个对象。 - smchae
使用这个软件包,您可以在一行代码中轻松上传任意数量和类型的文件。 - ako
4个回答

3
实际上,只需在您的输入文件中放置一个数组,就像这样:
<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.
}

我正在尝试上传多个文件的多个序列。因此,我必须以数组形式获取这些文件,然后循环遍历该数组并为每个操作(订单创建)访问每个文件。 - smchae

3

您是否使用 $request->files 来获取文件列表?如果是的话,请改用 $request->allFiles()。该方法将把 File 对象转换为 UploadedFile 对象,以便更好地处理文件。


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) {
        // ...
    }
}

0
可能之前你的 $image 对象被强制转换成了字符串,所以运行起来比较顺利。我猜最后一行代码只需要简单修改一下就可以了。
$disk->put($path, $file->__toString());

将修复该问题,而且更安全,因为“put”方法官方上只接受字符串(并且根据实现也是PHP资源)。这样可以确保您长期兼容性。


你能打印它吗?$file->__toString()? - KPK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接