使用Vue.js和Python下载文件

使用Vue.js和Python下载文件,python,vue.js,flask,Python,Vue.js,Flask,我的烧瓶是REST服务器 在我的烧瓶路线上,我有: @app.route('/v1/download', methods=['POST']) def download_tissue(): f = open('path_to_zip_file', 'rb') // or r for text file return f.read() (之前我使用的是Flask的send_file()。但我不确定send_file做什么,我不能仅仅阅读它,我正在尝试简化案例以解决问题。) 在客户端

我的烧瓶是REST服务器

在我的烧瓶路线上,我有:

@app.route('/v1/download', methods=['POST'])
def download_tissue():
    f = open('path_to_zip_file', 'rb') // or r for text file
    return f.read()
(之前我使用的是Flask的
send_file()
。但我不确定send_file做什么,我不能仅仅阅读它,我正在尝试简化案例以解决问题。)

在客户端上,我有一个Vue应用程序发出异步请求:

axios.post('download')
.then((res) => {
    let data = res.data;
    const blob = new Blob([data], { type: 'application/zip' })
    let link = document.createElement('a')
    link.href = window.URL.createObjectURL(blob)
    link.download = 'test.zip'
    link.click()
})
.catch(error => {
    console.error(error);
});
问题是我无法在Mac上解压它。无法在中展开test.zip进行下载。(错误1-不允许操作。)文件大小也是错误的。它几乎是22MB,而不是原来的12MB


如果我打开纯文本文件,它会工作,但zip文件不会工作。

我猜您是以字节模式打开文件的,但是当它在view函数中返回时,Flask尝试将其解码为字符串,然后编码回字节。这就是为什么你会得到一个更大的文件

尝试返回

flask.send_file("path/to/file.zip", mimetype="application/zip", as_attachment=True, attachment_filename="filenamefordownload.zip")

好吧,我知道了。我实际上需要如下配置axios响应类型:

axios({
        url: url
        method: 'POST',
        responseType: 'blob', // important
})
.then((res) => {
})
实际上,我更喜欢使用默认的URL设置,但是下面的设置对我不起作用

axios.post('download', {
    responseType: 'blob',
})
.then((res) => {

对不起,我刚刚要回去完成这项任务。这对我不管用。这就是为什么我试图亲自阅读文件,看看哪里出了问题。文件大小仍然不正确(同样大小也不正确),我仍然无法解压缩它。我将其更改为HTTP GET,并使用浏览器直接访问它。它起作用了。因此,我的axios设置可能有问题。我找到了解决方案,如何在gist上使用vue下载该文件: