刚接到一个需求,要求在一个页面进行视频点击下载,而不是点击之后跳转到新页面进行预览

之前做过下载图片都是通过转成base64的形式进行下载,但是视频文件太大,这种方式肯定是不行的,后来网上查了一下,可以通过转换成Blob格式进行下载,这种方式可以是可以,但是有一个问题,就是必须等ajax请求完成之后,才会弹出下载框,而且这种方式其实文件已经下载到内存中了,在你点击下载之后就直接可以下载下来了,但是如果文件1G大小还通过这种方式下载的话就太不人性化了

后来,才发现,这个问题解决的话需要后端进行处理
需要后端设置esponse请求头中的Content-Disposition: attachment
从而告诉浏览器这是一个文件,不需要进行预览,直接下载就可以

这里通过NodeJS实现了一下,贴上静态文件处理代码

app.use(
  express.static('public', {
    setHeaders(res) {
      res.attachment(); // 主要是这句话起作用
    }
  })
);

然后我看了一下https://pixabay.com/zh这个网站的下载图片的方法,应该是类似下面代码中的方法进行实现的

app.get('/download', (req, res) => {
  // 上述网站的下载应该是用的这种方式
  // 直接服务器返回302状态并跳转对应文件地址即可
  // 这种仅限制在前后端同源的情况
  // 当然如果是同源的情况,直接前端使用a标签进行跳转也可
  res.redirect(302, http://localhost:4001/static/GoodCrazy.mp4');
  // 而如果前后端分离的项目,涉及到跨域的话,可以用下面的这种方式
  // 返回给前端一个静态文件下载地址,前提是对静态文件设置了attachment属性
  res.send({
    url: 'http://localhost:4001/static/GoodCrazy.mp4'
  });
});
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐