0

値が画像のデータURIである入力のあるフォームがあります "data:image/jpg;base64,/9j xxxxxxx...".

ユーザーがこれを使用して画像をトリミングすると、その値が入力に与えられます-> http://fengyuanchen.github.io/cropper/ したがって、dragond イベントで、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を使用しています

4

2 に答える 2

1

私はすべてを試しました...クライアントはそれをクライアント側のトリミングにすることを主張し、私はbase64画像で立ち往生していました...だから私はハッキーな解決策を見つけました...

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;

    }

私はこれが良い解決策ではないことを知っています。誰かがより良いアイデアを持っている場合は、助けてください:)

于 2015-01-27T15:20:32.580 に答える
0

多くのことが考えられます...リバース プロキシ (nginx や cloudflare など) が大きなアップロードをブロックしています。body パーサーが大きな urlencoded/json リクエストをブロックしています。

代わりにすべきことは、マルチパートまたは xhr2/File API を使用して画像をアップロードすることです。

于 2015-01-25T22:51:02.950 に答える