Как получить файл, отправленный из колбы с помощью Curl?

Вот код на стороне сервера с Python и Flask:

from flask import Flask, request, send_file
import io
import zipfile
import bitstring

app = Flask(__name__)

@app.route('/s/',  methods=['POST'])
def return_files_tut():
    try:
        f = io.BytesIO()
        f.write("abcd".encode())
        return send_file(f, attachment_filename='a.ret.zip')
    except Exception as e:
        return str(e)

if __name__ == '__main__':
    app.run(debug=True)

Ниже приведена команда Curl:

λ curl -X POST  http://localhost:5000/s/ -o ret.tmp
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     4    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
curl: (18) transfer closed with 4 bytes remaining to read

Как мне использовать Curl для получения файла?

У меня это работает нормально.

user459872 10.05.2024 10:56

@user459872 user459872 пробовал на Windows и MacOS, ошибка все еще присутствует.

heLomaN 10.05.2024 13:24

это не «ошибка», просмотрите содержимое буфера перед отправкой с помощью print(f.read())

cards 10.05.2024 17:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
93
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При записи данных указатель перемещается на следующую позицию в файле. Это означает, что перед тем, как данные будут прочитаны, чтобы сделать их доступными для загрузки, указатель указывает на конец, и дальнейшие данные не считываются. Поэтому загрузка не удалась. Чтобы предложить файл для загрузки, указатель внутри файла необходимо сбросить в начало, используя seek(0).

Атрибут attachment_filename для send_file() устарел и заменен на download_name.

@app.post('/s/')
def return_files_tut():
    f = io.BytesIO()
    f.write("abcd".encode())
    f.seek(0)
    return send_file(f, download_name='a.ret.zip')

в качестве альтернативы можно передать всю строку непосредственно в BytesIO-конструктор, см. пример

cards 10.05.2024 17:09

Другие вопросы по теме