0

我正在使用 npm 的请求包将文件缓冲区发布到使用 meteor.js restivus 包编写的 REST api。我发布到 api 的 node.js 客户端代码如下:

    url = ' http://localhost:3000/api/v1/images/ ';

fs.readFile('./Statement.odt', function read(err, data) { if (err) { throw err; } console.log(data); //At this stage the file is still a buffer - which is correct var file = data; request.post({ uri: url, headers: { 'X-User-Id': userId, 'X-Auth-Token': authToken }, form: { file: file, //Inside the request.post the file is converted to binary encoding name:"Statement.odt" } }, function(err, httpResponse, body) { if (err) { return console.error('post failed:', err); } console.log('Get successful! Server responded with:', body); }); });

这里的问题/问题是在 request.post 中,文件被转换为二进制编码的 blob。请参阅上面代码中“request.post”第一个参数的“form:”属性中的注释。这在我的meteor.js 服务器上成为一个问题,其中文件需要作为缓冲区而不是二进制编码文件。(信息:我正在使用 Ostr-io/files 的 GridFS 来存储文件 - 它要求文件是缓冲区)

如果除了将文件作为编码字符串传递之外别无他法,那么有没有办法将该编码的 blob 转换回我正在使用/谈论 meteor.js 的缓冲区服务器端?请帮忙!

如果您需要更多信息,请告诉我,我会提供。

4

1 回答 1

0

我找到了自己问题的答案。我发布到 api 的 node.js 客户端代码更改如下:

	url = 'http://localhost:3000/api/v1/images/';
	fs.readFile('./Statement.odt', function read(err, data) {
		if (err) {
			throw err;
		}
		console.log(data);
		//var file = new Buffer(data).toString('base64');
		var file = data;
		//var file = fs.readFileSync('./Statement.odt',{ encoding: 'base64' });
		
		var req = request.post({
		  uri: url, 
		  headers:	 {
			'X-User-Id': userId,
			'X-Auth-Token': authToken
		  },
		  /*form: { //Post to the body instead of the form
			  file: file,
			  name:"Statement.odt",
		  },*/
		  body: file, //Post to the body instead of the form
		  json:true  //Set json to true
		  //encoding: null
		}, function(err, httpResponse, body) {
		  if (err) {
			return console.error('post failed:', err);
		  }
		
		  console.log('Get successful!  Server responded with:', body);
		});
	});

在服务器端按如下方式访问 json 数据并将文件转换回缓冲区:

var bufferOriginal = Buffer.from(this.request.body.data)

请注意,当您执行 console.log(bufferOriginal) 时,您会得到以 utf8 编码的文件的输出,但是当您在代码中的任何位置引用/使用 bufferOriginal 时,它会被识别为看起来像这样的文件缓冲区:

<Buffer 50 4b 03 04 14 00 00 08 00 00 00 55 f6 4c 5e c6 32 0c 27 00 00 00 27 00 00 00 08 00 00 00 6d 69 6d 65 74 79 70 65 61 70 70 6c 69 63 61 74 69 6f 6e 2f ... >

感谢@Dr.Dimitru 推动我朝着解决方案的方向前进,并指出 this.request.body 已经是 json

于 2018-07-26T10:39:19.217 回答