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;
}
我知道这不是一个好的解决方案。如果有人有更好的主意,请帮助:)
我有一个表单,其输入值是图像的数据 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;
}
我知道这不是一个好的解决方案。如果有人有更好的主意,请帮助:)