3

POSTbase64 文字列としてエンコードされた画像があり、別の REST API ( http://ocrapiservice.com/documentation/ ) へのパラメーターとしてそれを試みています。

ファイルをディスクに保存する必要はありません - ファイルをメモリに保持したいのは、最終的にgetUserMediaはクライアントで使用してイメージを作成する必要があり、直接ファイルを許可しないホストされたサービスを使用する可能性が高いためです。 IO.

fs.createReadStream(somePath);私が抱えている問題は、たとえば https://github.com/mikeal/request/blob/master/README.md#formsを使用してディスクから投稿画像を見つけることができるほとんどの例です。

requestライブラリなどのライブラリを使用したいのですが、おそらくそれは不可能でしょう。

私が今持っているコードは次のとおりです。

var fs = require( 'fs' );
var path = require( 'path' );

var request = require( 'request' );
var WS_URL = 'http://api.ocrapiservice.com/1.0/rest/ocr';

function ocr( postData ) {
    var r = request.post(WS_URL, completed);
    var form = r.form();

    form.append('apikey', 'REMOVED');
    form.append('language', 'en' );
    form.append('image', postData );

    function completed(error, response, body) {
        console.log( body );
    }
}

// This works
ocr( fs.createReadStream(path.join(__dirname, 'example.png' ) ) );

// This does not work
// ignore that it's being read from a file (the next line)
var base64Str = fs.readFileSync( 'example.png' ).toString('base64'); 

var buffer = new Buffer(base64Str, 'base64');
ocr( buffer.toString( 'binary' ) );

form.append追加のパラメーターを送信できるようにするため、追加のヘッダーを設定する必要がある場合は、それが可能です。

Stream私が使用できるある種のラッパーはありますか?このStringReaderの例を使用してみましたが、少なくともファイル名と正しい Content-Type を送信するように変更することができます。

メモリ内ファイルを Web サービスへのパラメーターとしてポストするにはどうすればよいですか?

アップデート:

上記のコードを修正/更新しました。

上記の REST API から得られる応答は次のとおりです。

HTTP/1.1 400 不正な要求

ファイルが提供されていません

これが私が実行している実際のコードです: https://gist.github.com/leggetter/4968764

4

3 に答える 3

0

ストリームバージョンではファイルの一部を操作していますが、base64Imageバージョンではbase64文字列を操作しています。ストリームバージョンが機能するため、ocrAPIは明らかに、フォームにバイナリデータが含まれていることを想定しているため、送信する前にbase64データをデコードする必要があります。

// Reading straight from a Buffer.
var imageData = fs.readFileSync('example.png');
ocr( imageData );

// Reading from a new Buffer created from a base64 string.
var base64Image = '...';
ocr(new Buffer(base64Image, 'base64'));

また、サンプルコードでは次の点に注意してください。

// This line:
var base64Image = new Buffer(imageData, 'binary').toString('base64');

// does the same thing as this, because 'imageData' is alreadya  Buffer
var base64Image = imageData.toString('base64');
于 2013-02-16T19:28:33.427 に答える
0

Bufferにラップすることなく、リクエストに直接使用できると確信していますStream

正しくないエンコーディングを使用しているため、機能していません。エンコーディングが存在しない場合、デフォルトでreadFileSync返されます。BufferBuffer は、エンコーディングとしてデフォルトで utf-8 を使用します。しかし、その間にエンコードをバイナリとして使用しました。これは、バッファにあるものと一致しません。

var imageData = fs.readFileSync('example.png');//After you get imageData 
var base64Image = imageData.toString('base64');    //base64 encoded string
var decodedImage = new Buffer(base64Image, 'base64');  //base64 encoded buffer
ocr (imageData);  //You can use the file directly
ocr (base64Image); //Or you can use either the base-64 string or the base64-buffer

エンコード/デコードの詳細については、こちらを参照してください NodeJS base64 画像のエンコード/デコードがうまくいきません

于 2013-02-16T19:41:07.040 に答える
0

同じ問題を抱えていたので、私が作成したbase64-image-upload NPM パッケージを使用できるはずです。

これが行うことは、base64 文字列からバッファを作成して POST する、user568109 によって概説されたアプローチとまったく同じです。重要な部分は、エンコーディング、MIME タイプ、およびリクエスト ヘッダーの処理を抽象化し、コードを大幅に簡素化することです。

于 2016-12-21T07:46:33.087 に答える