"SplFileInfo::getSize(): stat failed" 上传文件时 Laravel 6.0 发生异常
"SplFileInfo::getSize(): stat failed" exception on Laravel 6.0 when doing file upload
我正在使用 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 来存储照片信息,例如图像与哪个 post 相关联、控制器生成的文件名以及图像在机器中的存储位置...如您所见,我正在为每个 post 创建单独的文件夹以用于组织目的...
目标是至少禁用异常原因,否则整个过程都正常...理论上我应该在上传完成后刷新页面。
你可以通过文件获取大小 class
$size = File::size($pathFile);
伙计们,我想通了...
可能需要在 Laravel 中进行一个小更新来解决这个问题...因为它很奇怪 "bug"。
所以,显然,你必须做一个 getSize();
,在我的情况下 $size = $image->getSize();
并将该值存储在某个地方,无论它是否在 SQL 数据库中......即使你不'需要数据...简单地将其存储为变量会引发错误。
一旦我做了 return $size
,错误就消失了,并返回了图像大小的字节值...当我将它存储为列中的 mySQL 值时,问题不是再次出席...
我希望这对某人有所帮助。哈哈。如果你遇到这个问题不明白,我很乐意解释。 :)
请先阅读文档,您保存图像的方式已在 laravel 5.4 中停止,请使用 laravel
记录的最新版本
$path = $request->photo->store('images');
$path = $request->photo->storeAs('images', 'filename.jpg');
其中 images
是目标路径,filename.jpg
是名称,如果您不想使用路径自动生成唯一 ID
希望对您有所帮助
另外请记住,如果您使用古老的方法来处理文件,例如:
$request->pdf_file->move(storage_path(self::DIRECTORY), $fileName);
你应该转向使用更现代的:
$file = $request->file('pdf_file');
因为这个弃用的方法本身会导致错误。 (从 5.5 更新到 6.0)
通过阅读 laravel 6.* 的文档,您可以看到上传文件可以使用 store
方法。
如果您想首先将文件存储在 public 或 public_html 运行 php artisan vendor:publish
中,然后在 config->filesystems.php
中定义新磁盘,例如名称为 public_local
并将此磁盘的根设置为 public 地址:
'public_local' => [
'driver' => 'local',
'root' => public_path(),
],
然后为了将文件存储在此磁盘中,您可以使用为文件设置唯一名称的存储方法或使用具有自定义名称的存储:
使用存储方法:
$path = $request->file('image_url')->store($imagePath, 'public_local');
$path = $request->file('image_url')->storeAs($imagePath, 'custom_name', 'public_local');
我遇到了这个错误 "SplFileInfo::getSize(): stat failed for C:\xampp\tmp\phpE84D.tmp"
我是怎么解决的-
因为我将原始文件名保存在数据库中,但我的数据库列的大小为 varchar 30,而我上传的文件的文件名太长。所以当我用更短的名字重命名文件时。那是上传的。然后我增加了我的列大小和我得到的,这个错误已经消失了。
因此,如果有人在您的文件上传代码中使用函数 $image->getClientOriginalName() 并将其保存到数据库,您必须验证文件名或必须增加数据库列大小。
无法让它工作,所以我使用了 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();
我也遇到了同样的问题。作为解决方案,我只是将可空函数添加到 table。
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);
}
使用extension()
方法代替getClientOriginalName()
我正在使用 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 来存储照片信息,例如图像与哪个 post 相关联、控制器生成的文件名以及图像在机器中的存储位置...如您所见,我正在为每个 post 创建单独的文件夹以用于组织目的...
目标是至少禁用异常原因,否则整个过程都正常...理论上我应该在上传完成后刷新页面。
你可以通过文件获取大小 class
$size = File::size($pathFile);
伙计们,我想通了...
可能需要在 Laravel 中进行一个小更新来解决这个问题...因为它很奇怪 "bug"。
所以,显然,你必须做一个 getSize();
,在我的情况下 $size = $image->getSize();
并将该值存储在某个地方,无论它是否在 SQL 数据库中......即使你不'需要数据...简单地将其存储为变量会引发错误。
一旦我做了 return $size
,错误就消失了,并返回了图像大小的字节值...当我将它存储为列中的 mySQL 值时,问题不是再次出席...
我希望这对某人有所帮助。哈哈。如果你遇到这个问题不明白,我很乐意解释。 :)
请先阅读文档,您保存图像的方式已在 laravel 5.4 中停止,请使用 laravel
记录的最新版本$path = $request->photo->store('images');
$path = $request->photo->storeAs('images', 'filename.jpg');
其中 images
是目标路径,filename.jpg
是名称,如果您不想使用路径自动生成唯一 ID
希望对您有所帮助
另外请记住,如果您使用古老的方法来处理文件,例如:
$request->pdf_file->move(storage_path(self::DIRECTORY), $fileName);
你应该转向使用更现代的:
$file = $request->file('pdf_file');
因为这个弃用的方法本身会导致错误。 (从 5.5 更新到 6.0)
通过阅读 laravel 6.* 的文档,您可以看到上传文件可以使用 store
方法。
如果您想首先将文件存储在 public 或 public_html 运行 php artisan vendor:publish
中,然后在 config->filesystems.php
中定义新磁盘,例如名称为 public_local
并将此磁盘的根设置为 public 地址:
'public_local' => [
'driver' => 'local',
'root' => public_path(),
],
然后为了将文件存储在此磁盘中,您可以使用为文件设置唯一名称的存储方法或使用具有自定义名称的存储: 使用存储方法:
$path = $request->file('image_url')->store($imagePath, 'public_local');
$path = $request->file('image_url')->storeAs($imagePath, 'custom_name', 'public_local');
我遇到了这个错误 "SplFileInfo::getSize(): stat failed for C:\xampp\tmp\phpE84D.tmp"
我是怎么解决的-
因为我将原始文件名保存在数据库中,但我的数据库列的大小为 varchar 30,而我上传的文件的文件名太长。所以当我用更短的名字重命名文件时。那是上传的。然后我增加了我的列大小和我得到的,这个错误已经消失了。
因此,如果有人在您的文件上传代码中使用函数 $image->getClientOriginalName() 并将其保存到数据库,您必须验证文件名或必须增加数据库列大小。
无法让它工作,所以我使用了 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();
我也遇到了同样的问题。作为解决方案,我只是将可空函数添加到 table。
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);
}
使用extension()
方法代替getClientOriginalName()