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

发布于 2022-09-11 14:48:39 字数 1144 浏览 14 评论 0

看了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);

}

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

黑寡妇 2022-09-18 14:48:39

传递入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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文