Верните файл на сторону клиента без сохранения на стороне сервера, который загружается из облачного хранилища GCP

# #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)