RuntimeException:SplFileInfo :: getSize():获取文件大小失败... Laravel 4上传图像

7
我使用 Laravel 4(最新版本),创建了一个表单,可以上传图片(logo/avatar)。我使用 MAC OS、Sublime Text 3、Laravel 和 MAMP 应用程序。我的所有配置都正确,没有运行问题。
我的问题是,当我提交表单中的字段时,出现以下错误:RuntimeException SplFileInfo::getSize(): stat failed for /Applications/MAMP/tmp/php/phpRUJfMX。
以下是我的表单代码 nameOfTheForm.blade.php:
@extends('layout.default')
@section('title')
Name Of My Project - EditProfile
@stop

@section('content')
{{Form::open(array('url'=>'uploadAvatar','files' => true))}}

<p>
{{Form::label('pseudo','pseudo (*): ')}}
{{Form::text('pseudo',Input::old('nom'))}}
</p>
@if ($errors->has('pseudo'))
<p class='error'> {{ $errors->first('pseudo')}}</p>
@endif
<br>
<br>

<p>
{{Form::label('url_Avatar','Avatar: ')}}
{{Form::file('url_Avatar',Input::old('Url_Avatar'))}}
</p>
@if ($errors->has('url_Avatar'))
<p class='error'> {{ $errors->first('url_Avatar')}}</p>
@endif
<br>
<br>

<p>
{{Form::submit('Validate your avatar')}}
</p>

{{Form::close()}}
@stop

这是我的控制器中的代码:
public function uploadAvatar() {


//*****UPLOAD FILE (on server it's an image, on the DB it's an url*****
  $file = Input::File('url_Avatar');

  //set a register path to the uploaded file
  $destinationPath = public_path().'/upload/';

  //have client extension loaded file and set a random name to the uploaded file, produce a random string of length 32 made up of alphanumeric characters [a-zA-z0-9]

  $filename = $destinationPath . '' . str_random(32) . '.' . $file->getClientOriginalExtension();

  $uploaded = Input::File('url_Avatar')->move($destinationPath,$filename);

//*****VALIDATORS INPUTS and RULES*****
  $inputs = Input::all();
  $rules = array(
    'pseudo' => 'required|between:1,64|unique:profile,pseudo',
    //urlAvatar is an url in database but we register as an image on the server
    'url_Avatar' => 'required|image|min:1',
  );

上传的文件代码运行完美,我将文件注册到所选文件夹中也没有问题。我的路由没有问题(不需要显示代码的此部分)。
但是当我提交表单时,出现了这个错误: RuntimeException SplFileInfo::getSize(): stat failed for /Applications/MAMP/tmp/php/phpRUJfMX 错误信息详情如下: open:/Applications/MAMP/htdocs/nameOfMyProject/vendor/laravel/framework/src/Illuminate/Validation/Validator.php
    }
    elseif (is_array($value))
    {
        return count($value);
    }
    elseif ($value instanceof File)
    {
        return $value->getSize() / 1024;
    }
    else

看起来,Laravel需要(stat - 给出文件的相关信息),也就是说,需要获取上传文件的信息,比如文件大小。但是我尝试在控制器中这行代码之前使用它,即在将文件移动到所选文件夹的$uploaded处:

//I add this line code before
$size= $file->getSize();
$uploaded=Input::File('url_Avatar')->move($destinationPath,$filename);

但是,当我这样做时,我又遇到了另一个错误:验证器无法将文件识别为图像并要求我上传有效的格式。我认为我需要纠正我之前的第一个错误(SplFileInfo::getSize())

如果您有任何想法...谢谢。


1
在移动文件之前,您必须先读取文件的属性。 请查看 https://stackoverflow.com/questions/53114252/runtimeexception-splfileinfogetsize-stat-failed-in-laravel/53114743 - Aldo Prinzi
4个回答

5
简短版本:如果文件大小大于php.ini的upload_max_filesize,Laravel的Symphony源代码将返回文件大小为0。
建议检查您的php.ini文件。如果您正在运行Laravel,我不确定MAMP如何处理php.ini,但它在那里。在php.ini中,upload_max_filesize可能小于您要上传的文件。该值在我的Ubuntu 12.10 VM上默认为2兆字节。
请检查 /vendor/symphony/http-foundation/Symphony/Component/HttpFoundation/File/UploadedFile.php 并检查getMaxFilesize()。默认情况下,此方法从主机系统上的PHP.ini文件中获取upload_max_filesize值。
有趣的是,如果您执行以下操作:
$foo = Input::file('uploaded_file') 
var_dump($foo) 

或者

使用Laravel的die&dump dd($foo),然后上传一个大于php.ini中upload_max_filesize设置的文件,会返回大小为0。

除了upload_max_filesize之外,PHP文档还提到需要检查php.ini以确保:

- post_max_size must be larger than upload_max_filesize
- memory_limit should be larger than post_max_size

我现在没有我的代码,但明天我会尝试这个解决方案。谢谢你们两个的理解。 - french_dev
为了让它工作,MAMP在htdocs文件夹中有另一个php.ini文件,我可以更改一些参数,如图像大小文件。所以我按照你的步骤,用你的代码。 - french_dev
1
http://php.net/manual/zh/ini.core.php#ini.post-max-size - 跟进Ryan的评论 - hoopyfrood

3

我在Laravel 6.x中遇到了同样的错误。这个错误是由于一个不可为空(not nullable)的列出现了空值引起的。

为了解决这个问题,我只需要将该列更改为可接受空值(accept null),然后一切都正常了。


3
我知道这个问题早就被回答了,但我在PHP网站上找到了一些有用的东西,因为它实际上解释了为什么会出现错误:
如果您正在使用Symfony的UploadedFile,请注意,如果您在调用@move之后调用此方法,则很可能会得到一些难以追踪的错误,该错误说:
stat failed
如果您真的考虑一下,它确实是有道理的,文件已经被Symfony移动,但getSize在SplFileInfo中,而SplFileInfo不知道文件已经被移动。
来源:https://www.php.net/manual/en/splfileinfo.getsize.php#122780

0

我通过编辑列属性默认值为“null”来解决了我的问题,问题已经消失。


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