[已解决]base64编码上传问题
发布于 8 年前 作者 qwong 28012 次浏览 最后一次编辑是 5 年前

新手请教一个base64编码上传的问题,请各位大侠帮忙指点一下,多谢。

背景:
提供上传接口给终端的JS调用,因为JS没办法直接上传,所以是把文件转成base64编码传给我,我再调文件服务器上传

问题:
我现在是拿到base64的字符串以后转成buffer保存到本地临时文件,再读取文件上传
因为我没办法把base64的编码直接转成readStream…
这个方法感觉很挫…请教有什么好办法没?

以下是我的代码:

app.post('/uploadBase64', function(req, res) {
var base64Data = req.body.base64Data;
var fileName = req.body.fileName;
var tempFilePath = path.join(__dirname, fileName);
// 用request上传文件
var r = request.post('http://文件服务器', function(error, response, body) {
	// 上传完以后删除临时文件
	fs.unlink(tempFilePath);
	res.send({
		media_id: JSON.parse(body).media_id
	});
});
// base64保存为临时文件
fs.writeFileSync(tempFilePath, new Buffer(base64Data, 'base64'));
var form = r.form();
form.append('media', fs.createReadStream(tempFilePath));
});
3 回复

终于搞定了…
buffer转stream用上面仁兄给的方法或者下面这个都行
http://stackoverflow.com/questions/13230487/converting-a-buffer-into-a-readablestream-in-nodejs

可是我试了很多次都有问题,传到后台以后变成字符串了
后来跟了一下代码,发现是form-data这个中间件影响的
下面这个是form-data的源码,可以看到他是根据path来判断的,因为我们自己转的stream没有path,所以就按照普通字符串处理了…

FormData.prototype._multiPartHeader = function(field, value) {
  var boundary = this.getBoundary();
  var header =
    '--' + boundary + FormData.LINE_BREAK +
    'Content-Disposition: form-data; name="' + field + '"';

  // fs- and request- streams have path property
  // TODO: Use request's response mime-type
  if (value.path) {
    header +=
      '; filename="' + path.basename(value.path) + '"' + FormData.LINE_BREAK +
      'Content-Type: ' + mime.lookup(value.path);

  // http response has not
  } else if (value.readable && value.hasOwnProperty('httpVersion')) {
    header +=
      '; filename="' + path.basename(value.client._httpMessage.path) + '"' + FormData.LINE_BREAK +
      'Content-Type: ' + value.headers['content-type'];
  }

  header += FormData.LINE_BREAK + FormData.LINE_BREAK;
  return header;
    };

确实 是一个巨蛋疼的问题 原本是 post 到第三方图床 的 sm.ms 网址,当时为了搞懂前端如何post到第三方服务器 花了半天时间, 现在又要将图片存到7牛,为了加快访问速度, 7牛好像又要我 先将文件存在服务器端本地文件,然后7牛做简单本地文件上传, 又花了半天时间,用了一个koa-busboy中间件,,轻松做到将文件存储本地, 后来发现7牛要base64格式才行,结果3天假期,我特么2天了,还没搞定上传图片后端nodejs /upload 接口实现,mmp 哎,大半个假期已经过去, 假期开始时候,本来是想写canvas小游戏,,结果服务器挂了,重新搭建服务器环境+mongodb数据库/nodejs/nginx/ 倒腾一整个白天弄完, 这道路好曲折

回到顶部