# #python #flask #google-cloud-platform #google-cloud-storage
Вопрос:
Я работаю с задачами разработки Flask и React, поэтому мне нужно передавать файлы из серверной части flask на клиентскую сторону react, которая загружается из облачного хранилища GCP с серверной части Flask.
Поэтому мой нынешний подход таков, как показано ниже.
@app.route('/api/download-file', methods=['GET'])
@token_required
def download_blob():
"""Downloads a blob."""
file_name = request.args.get('file_name')
storage_client = storage.Client()
bucket = storage_client.bucket(app.config.get('CLOUD_STORAGE_BUCKET'))
blob = bucket.blob(file_name)
print(blob.exists())
blob.download_to_filename(file_name)
return send_file("./" file_name, as_attachment=True, mimetype="application/vnd.ms-excel")
поэтому моя проблема в том, что теперь все файлы, загруженные из flask, сохраняются в папке сервера, и после инструкции return я не могу выполнить строки для удаления этого файла.
Я не мог найти никакого решения для возвращаемого файла без сохранения на сервере
Комментарии:
1. Подайте файл из памяти, если он достаточно мал. 1) blob.download_as_string() 2) Создайте объект ByteIO (mem) и скопируйте в строку. 3) Подайте файл из памяти, верните send_file(mem, as_attachment=True, mimetype=»приложение/vnd.ms-excel») 4) Теперь вам не нужно удалять временный файл. 5) send_file() может принимать строку, я не проверял, что означает пропуск объекта ByteIO.
Ответ №1:
Основываясь на комментариях Джона Хэнли, вы сможете достичь цели с помощью приведенного ниже кода. таким образом, вы можете обслуживать любые файлы, не заботясь о типе содержимого
@app.route('/api/download-file', methods=['GET'])
@token_required
def download_blob():
"""Downloads a blob."""
file_name = "dir/" request.args.get('file_name')
storage_client = storage.Client()
bucket = storage_client.bucket(app.config.get('CLOUD_STORAGE_BUCKET'))
blob = bucket.get_blob(file_name)
content_type = None
try:
content_type = blob.content_type
except:
pass
file = blob.download_as_string()
print(type(file), "downloaded type")
return Response(file, mimetype=content_type)