上传到生产服务器时,上传 4mb 图像文件会出现 HTTP 413 错误

Posted

技术标签:

【中文标题】上传到生产服务器时,上传 4mb 图像文件会出现 HTTP 413 错误【英文标题】:4mb image file upload gives HTTP 413 error when uploading to production server 【发布时间】:2017-04-20 03:34:31 【问题描述】:

我正在尝试将图像从客户端上传到服务器进行处理,然后再上传到 S3 AWS 存储桶。它在本地服务器上工作得很好,但在实时服务器上却不行。

XMLHttpRequest cannot load https://api.parthenon-click.com/img_upload/cover. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://www.parthenon-click.com' is therefore not allowed access. The response had HTTP status code 413.

我使用 ElasticBeanstalk php v5.4 作为客户端服务器,使用 Node v7.0 和 Express v4 服务器作为后端。客户端是简单的 html/css/jQuery。我从用户库中抓取一张照片并将其传递给后端:

    $.ajax(
      url: api_url,
      type: 'POST',
      data: form,
      processData: false,
      contentType: false,
      success: function(data)
          console.log('upload successful!');
      ,
      error: function(err)
          console.log(err);
      
);

只要文件小于 1mb,它就可以工作并保存图像。虽然我仍然收到 504 HTTP 错误。只要我运行的是本地服务器,无论文件大小如何,它都能正常工作。

所以我尝试提高body-parserhtaccessmulter 限制:

正文解析器:

app.use(bodyParser.json(limit: '50mb'));
app.use(bodyParser.urlencoded( limit: '50mb', extended: true, parameterLimit:50000 ));
app.use(bodyParser.raw( limit: '10mb') );

穆尔特:

var upload = multer(
    storage: storage,
    limits: 
        fileSize: 10000000
    
)

.htaccess:

php_value upload_max_filesize 30M

我的头文件适用于所有其他类型的 api 请求。我设置它们使用:

router.use(function(req, res, next) 
    // do logging
        //set CORS policy to 'allow'
    res.setHeader("Access-Control-Allow-Methods", "POST, PUT, OPTIONS, DELETE, GET");
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");

    next();
);

最后但并非最不重要的一点是,所有域版本都启用了 SSL。

这些都没有解决问题。我在这里错过了什么?

【问题讨论】:

在 Node 和 PHP 之前你使用的是 Apache 还是 nginx @CreasolDev Nginx 那么,我可能已经得到了你的答案,请稍等。 尽你所能。这个让我摸不着头脑 【参考方案1】:

在 Node 之前使用 Nginx 之类的网络服务器时,所有请求都会通过 Nginx 并在到达 Node.js 之前由 nginx 验证。

Nginx 默认有一个配置文件位于/etc/nginx/nginx.conf。这个文件有很多用于所有请求的默认属性,其中之一是client_max_body_size。该属性的默认值为1m,就像您的 1MB 文件一样。

这也是你的.htaccess 文件没有做任何事情的原因(Node.js 本身从不对.htaccess 做任何事情,除非你想要它)

您可以手动将其更改为不同的数字,这将是 nginx 的新最大主体大小(重新加载 nginx 后),但如果您想要“完全”控制并让应用程序检查主体大小,您也可以将其设置为0,以禁用检查客户端请求正文大小。Setting size to 0 disables checking of client request body size.

请注意,更改该属性也会更改 PHP 请求的最大上传大小。

【讨论】:

感谢 Creasol。几天后我才能重新解决这个问题。不过,这将是我的首选。 好的!让我知道它是否有效,我不介意答案左侧的绿色复选标记;)另外,我在自己的项目中遇到了(至少我认为)完全相同的问题,这让我抓狂以同样的方式前进。 那行得通。真是个兔子洞。对于下一个需要这个的人,这就是你如何设置你的实例的配置文件...***.com/questions/18908426/…

以上是关于上传到生产服务器时,上传 4mb 图像文件会出现 HTTP 413 错误的主要内容,如果未能解决你的问题,请参考以下文章

每次上传新文件时都会出现 403 禁止错误

如何在angularjs上传图像时自动压缩图像

如果asp.net mvc3中的大小超过4mb,则无法上传文件[重复]

.m4a 文件在上传到服务器时未播放

如何将 AppendBlob/大于 4mb 限制的文件上传到 Java 中的 Azure 存储/Blob?

新上传的照片出现 404 错误。如果我停止然后运行网站,图像会加载