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 xM
和 php_value post_max_size xM
其中 x = 任何数值 .. 例如:100M = 100mb
也许您可以使用 .htaccess 文件进行更改:***.com/a/2185500/386579
【参考方案1】:
post_max_size 和 upload_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
示例不再有效。我将<IfModule mod_rewrite.c> php_value post_max_size 1M php_value upload_max_filesize 1M </IfModule>
放入我的`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】:您可以通过 max 验证器检查文件的大小
'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_size
、upload_max_filesize
和memory_limit
的值,默认情况下它们的值分别为8M
、2M
和128M
。现在你明白为什么你不能上传超过 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 最大上传大小限制时验证文件大小的主要内容,如果未能解决你的问题,请参考以下文章