【问题标题】:How to serve a file with correct filename and extension in Koa?如何在 Koa 中提供具有正确文件名和扩展名的文件?
【发布时间】:2019-09-02 00:42:41
【问题描述】:

我正在尝试让用户使用 Koa 框架上传文件,将其存储在服务器端并允许稍后再次下载。

当使用koa-body上传文件时,上传的文件没有扩展名和随机字符串,如何以原始文件名和扩展名作为下载文件?

我在网上找到的所有在线示例都假定文件以原始文件名上传,此处并非如此。

const bodyparser = require('koa-body');

app.use(bodyparser({
  formidable: { uploadDir: './uploads' },
  multipart: true,
  basedir: './views',
  apps: app,
}));

文件被正确上传到上传文件夹,但文件名和扩展名被删除并替换为随机字符串。 (例如upload_1d421fb33fcd1d43efc41352975358da)

router.post('/add', add);
router.get('/download/:filename', getDownload);

async function add(ctx) {
  const { body } = ctx.request;
  const thingfile = await ctx.request.files.thingfile;
  things.push({ name: body.thing, file: thingfile });

  ctx.redirect('/');
}

async function getDownload(ctx) {
  const {filename} = ctx.params;
  ctx.attachment(filename);
  await send(ctx, fname, { root: __dirname + '/uploads' });
}

我可以在调用 URL/uploads/upload_1d421fb33fcd1d43efc41352975358da 时下载文件,但必须在客户端手动重命名文件才能正常工作。

显然我遗漏了一些东西,或者我做错了。 我有点迷路了,所以提前感谢你引导我回到正轨!

【问题讨论】:

    标签: koa


    【解决方案1】:

    我正在使用 koa-body 并且可以获得实际名称

    router.post('/stream', async (ctx) => {
      const { file } = ctx.request.files
      const { path, name } = file
      ctx.body = name
    })
    

    您可以将名称属性添加到中间件配置中。

    app.use(bodyparser({
      multipart: true,
      formidable: {
    
        keepExtensions: true,
        onFileBegin: (name, file) => {
    
          console.log(name)
          // get the file extension
          const ext = name.split('.').pop()
          console.log(ext)
    
        },
      },
    }))
    

    你可以console.log名字

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-25
      • 2013-11-25
      • 2018-10-19
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      相关资源
      最近更新 更多