上传文件时 Laravel 6.0 出现“SplFileInfo::getSize(): stat failed”异常

Posted

技术标签:

【中文标题】上传文件时 Laravel 6.0 出现“SplFileInfo::getSize(): stat failed”异常【英文标题】:"SplFileInfo::getSize(): stat failed" exception on Laravel 6.0 when doing file upload 【发布时间】:2020-01-11 14:55:49 【问题描述】:

我正在使用 Laravel 6.0 构建一个简单的图片上传系统。

但是由于某些奇怪的原因,即使图像已成功上传到正确的文件夹,我仍然遇到“SplFileInfo::getSize(): stat failed”异常...有什么我可以做的 1) 跳过这个异常并隐藏它 2) 完全修复它?

我确实看到了将 max_file_size 和 post_max_size 等更改为更高值并重新启动 Apache 的解决方案。我试过了,但也没有用……而且似乎没有任何明确的解决方案。

这是我控制器上用于上传功能的内容

public function fileUpload(Request $request) 
        $this->validate($request, [
            'img' => 'required|image|mimes:jpeg,png,jpg,',
        ]);

        if ($request->hasFile('img')) 
            $image = $request->file('img');
            $size = $image->getSize();
            $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
            $charactersLength = strlen($characters);
            $randomString = '';
            for ($i = 0; $i < 5; $i++) 
                $randomString .= $characters[rand(0, $charactersLength - 1)]; // Generate random 5 character name...
            
            $name = $randomString.'.'.$image->getClientOriginalExtension();
            $destinationPath = public_path('storage'.'\\'.$request->input('post'));

            // Store Image Information //
            $data = new Photo();
            // Get post number //
            $data->order = $request->input('post');
            $data->filename = $name;
            $data->location = $destinationPath;
            $data->save();

            // Now move to the destination path //
            $image->move($destinationPath, $name);

            return refresh();
        
    

我正在使用 mysql 来存储照片信息,例如图像与哪个帖子相关联、控制器生成的文件名以及图像在机器中的存储位置......如您所见,我是为组织目的为每个帖子创建单独的文件夹...

目标是至少禁用异常原因,否则整个工作正常...理论上我应该在上传完成后刷新页面。

【问题讨论】:

【参考方案1】:

各位,我想通了……

可能需要在 Laravel 中进行一次小更新来解决这个问题……因为这是一个奇怪的“错误”。

所以,显然,您必须执行 getSize();,在我的情况下为 $size = $image-&gt;getSize(); 并将该值存储在某个地方,无论它是否在 SQL 数据库中...即使您不需要数据...只需存储它作为一个变量会抛出错误。

我执行return $size 后,错误消失并返回图像大小的字节值...当我将其作为 mySQL 值存储在列中时,问题不再存在...

我希望这对某人有所帮助。哈哈。如果您遇到这个问题并且您不明白,我会很乐意解释。 :)

【讨论】:

嗨,为什么我们甚至需要 getSize();我们不需要尺寸。 不做就不能上传文件。我试过了。 我在寻找答案,发现如果你在php.ini 文件中增加upload_max_size。此错误将得到解决,并且可以正常工作。【参考方案2】:

你可以通过 File 类获取大小

$size = File::size($pathFile);

【讨论】:

SplFileInfo::getSize(): stat failed for C:\xampp\tmp\phpC266.tmp 我仍然收到此错误。即使getSize() 不再在代码中... 尝试使用原生 php 代码 .$spl=new SplFileInfo($_FILES['img']['name']); echo $spl->getSize(); 如果没有权限可能需要权限可能会出错。 SplFileInfo::getSize(): stat failed for C:\xampp\tmp\php8009.tmp 还是同样的错误。不知道有没有办法关闭这个异常... 你有没有尝试增加php.ini文件中的upload_max_size?【参考方案3】:

请先阅读文档,因为您保存图像的方式在 laravel 5.4 中已停止,请使用 laravel 记录的最新版本

$path = $request->photo->store('images');
$path = $request->photo->storeAs('images', 'filename.jpg');

images 是目标路径,filename.jpg 是名称,如果您不希望自动生成带有路径的唯一 ID

希望对你有帮助

【讨论】:

但它不再出现在 laravel 5.5+ 的文档中检查链接laravel.com/docs/6.x/requests#storing-uploaded-files【参考方案4】:

另外请注意,如果您使用古老的方法来操作文件,例如:

 $request->pdf_file->move(storage_path(self::DIRECTORY), $fileName);

你应该转向使用更现代的:

 $file = $request->file('pdf_file');

因为这种不推荐使用的方法本身会导致错误。 (从 5.5 更新到 6.0)

【讨论】:

【参考方案5】:

通过阅读 laravel 6.* 的文档,您可以看到上传文件可以使用 store 方法。 如果您想在第一次运行 php artisan vendor:publishconfig-&gt;filesystems.php 中将文件存储在 public 或 public_html 中,请定义新磁盘,例如名称为 public_local 并将此磁盘的根设置为公共地址:

'public_local' => [
            'driver' => 'local',
            'root' => public_path(),
        ],

然后为了将文件存储在此磁盘中,您可以使用为您的文件设置唯一名称的 store 方法或使用自定义名称的 storeas: 使用 store 方法:

$path = $request->file('image_url')->store($imagePath, 'public_local');
$path = $request->file('image_url')->storeAs($imagePath, 'custom_name', 'public_local');

【讨论】:

【参考方案6】:

我收到此错误“SplFileInfo::getSize(): stat failed for C:\xampp\tmp\phpE84D.tmp”

我是如何解决的 -

因为我将原始文件名保存在 DB 中,但我的 db 列的大小为 varchar 30,并且我上传的文件名太长。所以当我用较短的名称重命名文件时。那上传了所以我增加了列大小,得到了什么,这个错误消失了。

因此,如果有人在您的文件上传代码中使用函数 $image->getClientOriginalName() 并将其保存到数据库,则您必须验证文件名或必须增加 db 列大小。

【讨论】:

【参考方案7】:

无法让它工作,所以我使用 Laravel 5.5 中的旧方法,它仍然有效:

   $filenameWithExt = $request->file('image')->getClientOriginalName();
   $filename = pathinfo($filenameWithExt, PATHINFO_FILENAME);
   $extension = $request->file('image')->getClientOriginalExtension();
   $fileNameToStore = $filename . '_' . time() . '.' . $extension;
   $path = $request->file('image')->storeAs('public/profile_images', 
   $fileNameToStore);
   $user->profile_image = $fileNameToStore;
   $user->save();

【讨论】:

【参考方案8】:

我也遇到了同样的问题。作为解决方案,我只是将可为空的函数添加到表中。

public function up()

    Schema::create('logos', function (Blueprint $table) 
        $table->bigIncrements('id');
        $table->string('favicon')->nullable();
        $table->string('homepage_logo')->nullable();
        $table->string('otherpage_logo')->nullable();
        $table->string('preloader')->nullable();
        $table->timestamps();
    );

LogoController.php

public function store(Request $request)

    $input = $request->all();
    if($request->has('favicon') || $request->has('homepage_logo') || $request->has('otherpage_logo') || $request->has('preloader'))

        $favicon = $request->file('favicon');

        $favicon_name =  time().'.'.$favicon->getClientOriginalName();

        $folder = 'empathy/adminpanel/assets/img/icon/';

        $favicon->move($folder, $favicon_name);

        $input['favicon']= $favicon_name;
    
    Logo::create($input);

【讨论】:

【参考方案9】:

使用extension() 方法代替getClientOriginalName()

【讨论】:

以上是关于上传文件时 Laravel 6.0 出现“SplFileInfo::getSize(): stat failed”异常的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 为单个项目上传多个文件并进行验证

android使用webview上传文件(支持相册和拍照),支持最高6.0安卓系统(改进版)

Laravel 6.0 Composer 依赖升级错误

Laravel 5.4 显示上传的图片问题

Laravel API:上传后出现 NotFoundHttpException

XAMPP:Laravel 6.0 的 htdocs 文件夹权限 [重复]