Laravel - 超过 PHP 最大上传大小限制时验证文件大小

Posted

技术标签:

【中文标题】Laravel - 超过 PHP 最大上传大小限制时验证文件大小【英文标题】:Laravel - validate file size when PHP max upload size limit is exceeded 【发布时间】:2018-02-14 11:30:21 【问题描述】:

我的网站托管在共享服务器上。最大上传限制为 5MB。我无法更改 php ini 设置,这很好。

在 Laravel 中,如果上传的文件小于 5MB,则所有验证和文件上传都可以正常工作。但是,当上传大于 5MB 的文件时,我收到以下异常而不是验证错误:

如何验证或强制文件低于服务器的上传限制?

【问题讨论】:

可能您必须更改 php.ini 中的 upload_max_filesize 值。如果您无权更改 ini 文件,请联系您的托管服务提供商以更改此设置 还有其他方法吗?不更改服务器的上传限制? 在您的资源文件夹中添加一个 htaccess .. 然后添加这一行 .. php_value upload_max_filesize xMphp_value post_max_size xM 其中 x = 任何数值 .. 例如:100M = 100mb 也许您可以使用 .htaccess 文件进行更改:***.com/a/2185500/386579 【参考方案1】:

post_max_sizeupload_max_filesize 是您可以设置来配置 php.ini 文件或 .htaccess 文件或 httpd.conf 文件的指令。

php.ini 示例:

post_max_size=15M
upload_max_filesize=15M

.htaccess 示例:

php_value post_max_size=15M
php_value upload_max_filesize=15M

httpd.conf 示例:

<VirtualHost *:80>
    ServerName www.example.com
    ServerAlias example.com
    DocumentRoot /var/www/html/example/
    ErrorLog /var/log/httpd/error.log
    <Directory /var/www/html/example/>
      AllowOverride None
      <IfModule mod_php5.c>
        php_value post_max_size=15M
        php_value upload_max_filesize=15M
      </IfModule>
    </Directory>
</VirtualHost>

【讨论】:

请注意,在上面的 .htaccess 示例中,您必须省略等号,否则您将收到 500 服务器错误 对于 PHP 7+,使用 php_value post_max_size 15M(不带 = 我认为.htacess 示例不再有效。我将&lt;IfModule mod_rewrite.c&gt; php_value post_max_size 1M php_value upload_max_filesize 1M &lt;/IfModule&gt; 放入我的`public/.htaccess 中(有和没有等号)。没有工作【参考方案2】:

您似乎对更改 PHP 限制以允许更大的文件不感兴趣。在我看来,您希望最大上传为 5MB,如果超过了,则返回正确的响应。

您可以在app/Exceptions/Handler.php 的异常处理程序中处理FileException 异常。更新render 方法以添加您需要的代码。例如,如果您想返回验证异常,则需要在 FileException 异常的异常处理程序中处理验证。

public function render($request, Exception $exception)

    if ($exception instanceof \Symfony\Component\HttpFoundation\File\Exception\FileException) 
        // create a validator and validate to throw a new ValidationException
        return Validator::make($request->all(), [
            'your_file_input' => 'required|file|size:5000',
        ])->validate();
    

    return parent::render($request, $exception);

这是未经测试的,但应该给你一个大致的想法。

您还可以通过 javascript 进行客户端验证,这样太大的文件实际上不会发送到您的服务器,但是客户端可以禁用或删除 javascript,因此最好有一个好的服务器端处理设置。

对于客户端验证,如果您将事件处理程序附加到文件输入的“更改”事件,您可以使用this.files[0].size 检查文件大小,然后执行任何其他操作(禁用表单、删除上传文件等)

【讨论】:

【参考方案3】:
$validator = Validator::make($request->all(), [
    'file' => 'max:5120', //5MB 
]);

在你的控制器中

在 php.ini 中

upload_max_filesize = 10MB

【讨论】:

如上所述,如果文件小于 5MB,它可以正常工作,但是如果我上传大小为 10MB 的文件并且我的服务器上的最大上传限制为 5MB,这将不起作用,它会抛出一个例外 那么您需要将 apache 的 max_upload_size 更改为大于 5MB,因为异常来自 apache 而不是 laravel,请检查编辑后的 ​​ans @baig772【参考方案4】:

你可以使用 Laravel 验证规则:

 'image_file_input_name' => 'required|mimes:jpeg,bmp,png|size:5000',

大小:值

验证中的字段必须具有与给定值匹配的大小。 对于字符串数据,该值对应于字符数。为了 数字数据,该值对应于给定的整数值。为 数组,大小对应数组的计数。对于文件,大小 对应于以千字节为单位的文件大小。

You can read more about validation and its usage.

【讨论】:

【参考方案5】:

在 php.ini 中更改下面的参数就可以了!对我来说。

upload_max_filesize = 50M
memory_limit = 512M
max_input_time = -1
max_execution_time = 0

【讨论】:

【参考方案6】:

您可以通过 ma​​x 验证器检查文件的大小

'file' => 'required|max:5128'; // max file size: 5M

【讨论】:

【参考方案7】:

步骤如下:

打开你的终端[CTL + SHIFT t] 运行以下命令:

$ php -i | grep php.i

上面的命令将打印你的服务器正在使用的 php.ini 文件的路径,在我的例子中,我得到了:

Configuration File (php.ini) Path => /etc/php/7.2/cli

加载的配置文件 => /etc/php/7.2/cli/php.ini

在此之前,您可能一直在编辑 /etc/php/7.2/apache2/php.ini 认为可以解决问题,但不,它没有! ?

现在运行:$ sudo nano /etc/php/7.2/cli/php.ini

我们关心的是post_max_sizeupload_max_filesizememory_limit 的值,默认情况下它们的值分别为8M2M128M。现在你明白为什么你不能上传超过 2MB 大小的文件了?。

接下来,搜索这些变量并更改它们的值以满足您的需要。执行此操作时,请确保大小遵循与默认值相同的比例,即 memory_limit 应该更大,然后是 post_max_size,然后是 upload_max_filesize。例如,就我而言,我使用了以下值:

post_max_size = 6G
upload_max_filesize = 4G
memory_limit = 8G

根据需要更改值后,使用 CTL X 保存更改,然后键入 Y 并按 ENTER。

接下来,重启apache:$ sudo /etc/init.d/apache2 restart

注意 - 如果正在运行 nginx,这适用于 apache 服务器 那么

$ sudo cp /etc/php.ini.default /etc/php.ini

编辑上述值

brew services restart php@7.2 [用你正在使用的 php 版本替换 7.2] 这就对了!现在您可以轻松上传上述指定值范围内的大文件了?。

【讨论】:

【参考方案8】:

在 laravel 中你可以这样验证 -

$validator = Validator::make($request->all(), [
    'file' => 'max:5120',
]);

该值以千字节为单位。即最大:10240 = 最大 10 MB。 而在 jquery -

绑定到输入字段的 onchange 事件

$('#upFile').bind('change', function() 

  //this.files[0].size         gets the size of your file and then you can validate accourdingly...
  alert(this.files[0].size);

);

希望这会对你有所帮助。

【讨论】:

【参考方案9】:

您可以使用 jQuery / javascript 来执行此操作(这意味着文件不会被上传,但您可以在文件发送到您的 PHP 脚本之前检查文件)

$('#myFile').bind('change', function() 
  let filesize = this.files[0].size // On older browsers this can return NULL.
  let filesizeMB = (filesize / (1024*1024)).toFixed(2);

  if(filesizeMB <= 5) 
      // Allow the form to be submitted here.
   else 
      // Don't allow submission of the form here.
  

);

但无论如何都要进行服务器端验证。以防您迁移到更强大的网站,但仍希望您的网站能够正常运行。

$validator = Validator::make($request->all(), [
    'file' => 'max:5120', //5MB
]);

所有这些都未经测试,但应该可以工作。

【讨论】:

【参考方案10】:

5 mb 限制由您的网络主机设置,可能无法更改。

要上传大于限制的文件,您必须分段上传。

一个这样做的 laravel 包:https://github.com/jildertmiedema/laravel-plupload

【讨论】:

以上是关于Laravel - 超过 PHP 最大上传大小限制时验证文件大小的主要内容,如果未能解决你的问题,请参考以下文章

如何设置php上传文件大小限制

如何使用 .htaccess 或 php.ini 增加上传文件大小限制? [复制]

jeecg 怎么 解除上传文件大小限制

php上传文件常见错误

解决wordpress上传文件2M限制

有没有一种特定的方法可以在一个输入中上传超过30张照片,而不会增加最大上传大小?