Nginx:将太大的文件上传到应用程序?

时间:2016-07-07 21:51:26

标签: symfony nginx file-upload

在nginx发出错误413页之前,我需要能够处理超过最大nginx和php限制的上传文件大小。相反,我想在我的应用程序(symfony)对话框中发出错误消息。

要测试symfony中的文件大小限制,我的测试上传文件为600 Mb。当我在nginx下上传600 Mb文件时,上传运行到100%,然后 报告“ 413请求实体太大”。

如果我运行“app / console server:run”(使用symfony服务器而不是nginx),symfony会在上传之前报告gui中的错误(按预期)。

有没有办法修改nginx配置,使其读取$ _SERVER [CONTENT_LENGTH]或$ _SERVER [HTTP_CONTENT_LENGTH],中止上传,然后将拒绝的请求传递给应用程序? Symfony根据CONTENT_LENGTH标记错误(并且,通过解决symfony问题,HTTP_CONTENT_LENGTH)。

文件大小限制:

src/my_app/CoreBundle/Resources/config/validation.yml: maxSize: '500M'
/etc/php5/cgi/php.ini:post_max_size = 550M
/etc/php5/cgi/php.ini:upload_max_filesize = 500M
/etc/php5/cli/php.ini:post_max_size = 550M
/etc/php5/cli/php.ini:upload_max_filesize = 500M
/etc/php5/fpm/php.ini:post_max_size = 550M
/etc/php5/fpm/php.ini:upload_max_filesize = 500M

版本:

symfony 2.5.12  
nginx 1.4.6-1ubuntu3.4

3 个答案:

答案 0 :(得分:1)

您可以在nginx配置http块中增加允许的大小。

client_max_body_size 800m;

设置一个比php.ini中的值更高的值。然后nginx服务器不响应413,symfony显示正常的错误页面,因为php限制。

答案 1 :(得分:0)

我通过在javascript中捕获文件选择中的更改来解决此问题,然后弹出警告并在文件太大时清除选择。

我的预感是nginx不以任何方式解析传入的请求,即它不读取CONTENT_LENGTH或HTTP_CONTENT_LENGTH,并且完全根据请求的大小是否超过client_max_body_size来拒绝请求。如果这是真的(确认或拒绝会很好),那么在使用nginx时除了让nginx运行上传并遇到413错误(这对于大文件和/或慢速网络来说是耗时的)时,没有办法处理这个问题。

答案 2 :(得分:0)

Content-Length适用于非分块内容,但是我怀疑你的上传是分块的,然后nginx无法找出你内容的大小。 即使它可以,也不应该通过它。

按HTTP / 1.1规范:  http://www.ietf.org/rfc/rfc2616.txt

3.If a Content-Length header field (section 14.13) is present, its
 decimal value in OCTETs represents both the entity-length and the
 transfer-length. The Content-Length header field MUST NOT be sent
 if these two lengths are different (i.e., if a Transfer-Encoding
 header field is present). If a message is received with both a
 Transfer-Encoding header field and a Content-Length header field,
 the latter MUST be ignored.