Sails.js 上传巨大的base64图片

Sails.js upload huge base64 image

我有一个表单,其输入值是图像的数据 URI,例如 "data:image/jpg;base64,/9j xxxxxxx...".

当用户使用这个裁剪图像时,该值被提供给输入 -> http://fengyuanchen.github.io/cropper/ 因此,在 dragend 事件中,我使用 getDataURL 填写输入值...

在表单提交时,数据进入控制器,我在控制器中使用 dataURI 获取扩展名、base64 字符串等...

然后我将 base64 写入文件,内容如下:

fs.writeFile(fileRoot+filePathAndName, imageBase64, 'base64', function (err) { ...

一切正常。但是......当我使用较大的图像(> 500kb所以实际上不是那么大)时我得到这个错误:

Unable to parse HTTP body- error occurred :: [Error: EUNFNTEX: Timed out waiting for known text parameters to finish streaming their bytes into the server.]

有趣的是它总是在本地主机上工作:(即使是巨大的图像。

有谁知道我怎样才能完成这项工作?或者甚至更好地建议如何使用船长或优质服务来完成此操作...

我在节点 v0.10.33 上使用 SailsJS v0.10.5

可能有很多原因...您的反向代理(如 nginx 或 cloudflare)阻止大量上传。正文解析器正在阻止大型 urlencoded/json 请求。

您应该做的是使用 multipart 或 xhr2/File API.

上传图像

我什么都试过了...客户坚持要让它在客户端裁剪,而我被 base64 图像卡住了...所以我找到了一个 hacky 解决方案...

Inside sails 应用程序:node_modules/sails/node_modules/skipper/lib/Parser

我更改了 prototype.parseReq.js 第 167 行:

var ms = 5;

收件人:

var ms = 100;

现在看起来像:

function finally_waitForTextParams() {
  // Careful: No error argument allowed in this callback!

  debug('waiting for any text params');

  // Make sure the `impatient` timeout fires no more than once
  clearTimeout(timer);

  // Take a look at all currently known text params for this Upstream,
  // then wait until all of them have been read.
  var ms = 100;
  var numTries = 0;
  async.doUntil(
    function setTimer(cb) {


      // Catch-all timeout, just in case something goes awry.
      // Should never happen, but a good failsafe to prevent holding on to
      // control forever.  It this timeout was to fire, we should error out and
      // cancel things.
      numTries++;
      if (numTries > 10) {
        return cb(new Error(
          'EUNFNTEX: Timed out waiting for known text parameters to finish ' +
          'streaming their bytes into the server.'
        ));
      }

      setTimeout(cb, ms);

      // Exponential backoff
      // (multiply ms by 2 each time, up to 500)
      ms = ms < 500 ? ms * 2 : ms;

    }

我知道这不是一个好的解决方案。如果有人有更好的主意,请帮助:)