Как распаковать объект FileStorage через gzip в Flask - PullRequest
0 голосов
/ 21 июня 2020

Я отправляю сжатый файл (сжатый с помощью gzip) в свое flask приложение через HTTP-запрос POST multipart / form-data. Запрос работает правильно, и когда я распечатываю значение ключа на консоли, он выводит следующее: <FileStorage: 'compressed.zip' ('application/zip')>. Он был сжат с использованием Windows zip, но будет сжат с использованием типа application/gzip. Ключ для файла compressed.zip называется compressed. Мой вопрос: как я могу распаковать файл gzip, а затем сохранить объект FileStorage по указанному пути c на бэкэнде? Вот код, который у меня есть сейчас:

from flask import request, Blueprint, make_response
import gzip
blueprint = Blueprint("blueprint", __name__)

@blueprint.route("/compressed-post", methods=["POST"])
def compressed_post():
    if request.method == "POST":
        file = request.files["compressed"]
        print(file)
        return make_response("", 200)
    else:
        return make_response("", 400)

Ответы [ 2 ]

1 голос
/ 03 июля 2020

Учитывая фрагмент вашего кода ...

@blueprint.route("/compressed-post", methods=["POST"])
def compressed_post():
    if request.method == "POST":
        file = request.files["compressed"]

... вам просто нужно передать file._file в конструктор ZipFile, поскольку ZipFile ожидает файловый объект ( или полный путь, которого здесь нет, поскольку файл еще не был сохранен на диск).

Затем вы можете использовать метод ZipFile s extractAll для извлечения файлов по пути, который вы например.

См. также

https://docs.python.org/3/library/zipfile.html#zipfile .ZipFile.extractall

Итак, полный код должен выглядеть примерно так:

from flask import request, Blueprint, make_response
import gzip
from zipfile import ZipFile
blueprint = Blueprint("blueprint", __name__)

@blueprint.route("/compressed-post", methods=["POST"])
def compressed_post():
    if request.method == "POST":
        file = request.files["compressed"]
        zip_handle = ZipFile(file._file)
        zip_handle.extractall(CHOOSE_YOUR_PATH)
        zip_handle.close()
        return make_response("", 200)
    else:
        return make_response("", 400)
        

ZipFile также имеет контекстный менеджер, если вы предпочитаете синтаксис with.

Предупреждение: _ в file._file указывает, что _file не является частью интерфейс publi c и может измениться в будущем.

0 голосов
/ 01 июля 2020

Попробуйте использовать следующее:

from flask import request, Blueprint, make_response
from zipfile import ZipFile
import gzip
blueprint = Blueprint("blueprint", __name__)

@blueprint.route("/compressed-post", methods=["POST"])
def compressed_post():
    if request.method == "POST":
        file = request.files["compressed"]
        print(file)
        file_name = file.filename
        with ZipFile(file_name, 'r') as zip: 
            # printing all the contents of the zip file 
            zip.printdir() 
  
            # extracting all the files 
            print('Extracting all the files now...') 
            zip.extractall(<path_to_destination_dir>) 
            print('Done!')
        
        return make_response("", 200)
    else:
        return make_response("", 400)

Подробнее о zip см. Здесь: ZipFile и extractall ()

См. Это для получения дополнительных сведений об объекте FileStorage: FileStorage

Если вам нужна дополнительная информация для хранения объекта FileStorage: Сохраните файл по пути назначения или файловому объекту. Если местом назначения является файловый объект, вы должны закрыть его после вызова. Размер буфера - это количество байтов, хранящихся в памяти во время процесса копирования. По умолчанию это 16 КБ.

См. Это: save

Надеюсь, это поможет.

...