上传文件时 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->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:publish
和 config->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”异常的主要内容,如果未能解决你的问题,请参考以下文章
android使用webview上传文件(支持相册和拍照),支持最高6.0安卓系统(改进版)