2015-01-24 3 views
0

У меня есть форма с вводом которой значение данных URI изображения, как "data:image/jpg;base64,/9j xxxxxxx...".Sails.js загрузить огромный base64 изображение

Это значение задается для ввода, когда пользователь культур изображения с помощью этого ->http://fengyuanchen.github.io/cropper/ Так что на мероприятии dragend I заполнить входное значение с getDataURL ...

по форме представить данные поступают в контроллер, где я делать вещи с dataURI, чтобы получить расширение, base64 строку и т.д. ...

Тогда я пишу, что base64 к файл с чем-то вроде:

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

Все работает безупречно. Но ... Когда я использую большие изображения (> 500Кб так не что большой Infact) Я получаю эту ошибку:.

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

Интересно, что он всегда работает на локальном хосте :(Даже с огромными изображениями

ли кто-нибудь есть идея, как я могу сделать эту работу? или еще лучше предложить способ, как это может быть сделано с помощью шкипера или хороший сервис ...

Я использую SailsJS v0.10.5 на узле v0.10.33

ответ

0

Я попробовал все ... Клиент настоял, чтобы сделать это на стороне клиента растениеводство, и я застрял с base64 изображениями ... Так что я нашел Hacky решение ...

Внутри парусов приложения: node_modules/парусов/node_modules/шкипер/Библиотека/Parser

Я изменил prototype.parseReq.js линию 167 из:

var ms = 5; 

To:

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; 

    } 

Я знаю, что это не является хорошим решением. Если у кого-то есть идея, пожалуйста, помогите :)

0

это может быть много вещей ... ваш обратный прокси (например, nginx или cloudflare) является блоком больших загрузок. синтаксический анализатор блокирует большие запросы urlencoded/json.

то, что вы должны сделать, это загрузить изображение с помощью multipart или xhr2/File API.

+0

Благодарим за совет. Я очень ценю это. Говоря о multipart, вы имеете в виду что-то вроде этого http://www.npmjs.com/package/multiparty, или вы просто говорите, что я должен использовать данные о множественной форме и загружать мои изображения обычным способом? – hlozancic

+0

На заднем конце, да. Если вы используете API файлов, вы можете отправить изображение в виде всего тела запроса. Для многопартийности вы можете использовать formdata для отправки изображения. –