【发布时间】:2013-02-16 15:12:26
【问题描述】:
我有一个编码为 base64 字符串的图像,我正在尝试将 POST 作为另一个 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 示例,并且可以对其进行修改以至少发送一个文件名和正确的内容类型。
如何实现将内存文件作为参数发布到 Web 服务?
更新:
我已经修复/更新了上面的代码。
我从上面列出的 REST API 得到的响应是:
HTTP/1.1 400 错误请求
没有提供文件
这是我正在运行的实际代码: https://gist.github.com/leggetter/4968764
【问题讨论】: