前端上传图片,在egg中,要怎么拿到上传图片的原路径?

看了egg的官方教程和实例,能拿到的都是处理之后的路径,这样的路径传入sharp中就会报错,无法压缩。请问有什么方法能拿到上传图片的原路径?

相关代码

async upload() {

const { ctx } = this;
const file = ctx.request.files[0];
if (!file) return ctx.throw(404);

const filename = encodeURIComponent(ctx.request.body.name) + path.extname(file.filename).toLowerCase();
const targetPath = path.join(this.config.baseDir, 'app/public', filename);
const source = fs.createReadStream(file.filepath);
const target = fs.createWriteStream(targetPath);


// await pump(source, target);
await sharp(target)
  // .rotate()
  .resize(100, 100)
  .toFile('/Users/lixiang/work/examples-master/multipart-file-mode/app/demo/'+ (Math.random() * 100000000).toFixed(0) +'.png', err => {
      if (err) throw err;
      console.log('Completed!');
  })
  // .then( data => {
  //     console.log('成功')
  //     console.log(data)
  // })
  // .catch( err => {
  //     console.log(err)
  // } );
ctx.logger.warn('save %s to %s', file.filepath, targetPath);
// delete tmp file
await fs.unlink(file.filepath);

ctx.redirect('/public/' + filename);

}

你期待的结果是什么?实际看到的错误信息又是什么?

阅读 4.5k
1 个回答

传递入sharp的参数除了文件路径外,还可以是Buffer。所以不需要拿原路径

况且这原路径
1:如果是指上传用户的路径:c://xxxx/xxx.png,这种你拿到了,传递给sharp也没用,因为它访问不到啊。
2:如果是文件的位置,此时就应该就是上传到服务器上,保存到某个地方的文件路径,但是有点多此一举,当然如果本来原文件就要保存就另说了。

回复评论(评论贴代码好麻烦):
根据你的代码,你拿到了stream,那你接下来就是stream转为Buffer。npm上有库干这个,不过也可以用这个函数。

function streamToBuffer(stream) {
  return new Promise((resolve, reject) => {
    const buffers = [];
    stream.on('error', reject);
    stream.on('data', data => buffers.push(data));
    stream.on('end', () => resolve(Buffer.concat(buffers)));
   });
}

可以拿到buffer

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题