Загрузите файл с Vue.js и Python Flask

My 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()

(Раньше я использовал send_file() от Flask. Но я не уверен, что делает 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 - операция запрещена.) Также размер файла неверный. Это почти 22 мб вместо исходных 12.

Если я открываю текстовый файл, он работает, но не zip-файл.


person huggie    schedule 08.10.2019    source источник


Ответы (2)


ОК, я разобрался. Мне действительно нужно настроить тип ответа axios следующим образом:

axios({
        url: url
        method: 'POST',
        responseType: 'blob', // important
})
.then((res) => {
})

На самом деле я бы предпочел использовать настройку URL-адреса по умолчанию, но следующее у меня не сработало.

axios.post('download', {
    responseType: 'blob',
})
.then((res) => {
person huggie    schedule 17.10.2019
comment
Я нашел решение, как загрузить файл с помощью vue на gist: gist.github.com/javilobo8/09786c30d43bd43bd4d4d07e08e6d07e6e5 / а> - person Artem Fedotov; 23.01.2020

Я предполагаю, что вы открыли файл в байтовом режиме, но когда он возвращается в функции просмотра, Flask пытается декодировать его в строку, а затем кодировать обратно в байты. Вот почему вы получаете файл большего размера.

попробуйте вернуться

flask.send_file("path/to/file.zip", mimetype="application/zip", as_attachment=True, attachment_filename="filenamefordownload.zip")
person rabbit.aaron    schedule 08.10.2019
comment
Извините, я только что вернулся к завершению этой задачи. У меня это не работает. Вот почему я пытался сам прочитать файл, чтобы понять, что пошло не так. Размер файла все еще неправильный (и неправильный тот же размер), и я все еще не могу его разархивировать. - person huggie; 17.10.2019
comment
Я меняю его на HTTP GET и открываю его напрямую в браузере. Оно работает. Так что, вероятно, что-то не так с моей настройкой axios. - person huggie; 18.10.2019