美文网首页
前端处理Node传递的二进制数据并下载

前端处理Node传递的二进制数据并下载

作者: Tme_2439 | 来源:发表于2019-07-18 18:42 被阅读0次

    背景:

    前端可上传任意类型的文件至后端,后端使用Node操作后保存在本地,并将决定路径和文件名保存至数据库。

    后端处理代码:
    // 下载附件api
    router.get('/recordFile', tokenAuth, (req, res) => {
        let { id } = req.query
      // Funds为mongoose文档模型
        Funds.findOne({'_id': id})
            .then((result) => {
                let fileData = fs.readFileSync(result.filePath) // 读取出来的fileData为Buffer类型的二进制数据
                res.send(fileData) // 直接发送给前端
            })
            .catch((err) => {
                res.send(err)
            })
    
    })
    
    前端处理代码:

    responseType:指定响应类型,arraybuffer或blob(这里两种都可以使用,原因未知,路过的大佬求告知),如果不写下载的文件会乱码。还有要注意的一个点是'文件名称',很重要,如果没有完整的文件名(包括扩展名),下载下来还需要自行添加,给download设置即可,代码如下:

          // 处理文件下载
          downloadFile (id, fileName) {
            let url = `/api/funds/recordFile`
            this.$axios.get(url, { params: {id}, responseType: "blob"} )  // arraybuffer也可以
              .then(({data}) => {
                console.log(data)
                // params:object 可选: File对象、Blob对象、MediaSource对象。
                let contentUrl = window.URL.createObjectURL(new Blob([data])) /
                let link = document.createElement('a')
                link.style.display = 'none'
                link.href = contentUrl
                link.setAttribute('download', fileName) // 文件名称,这里很重要,如果没有完整的文件名(包括扩展名),下载下来还需要自行添加
                document.body.appendChild(link)
                link.click()
                window.URL.revokeObjectURL(contentUrl)
              })
          }
    
    如有疑问或者错误指正,敬请留言。感谢!!!

    相关文章

      网友评论

          本文标题:前端处理Node传递的二进制数据并下载

          本文链接:https://www.haomeiwen.com/subject/farrlctx.html