Распакуйте файл и сохраните его содержимое в базе данных. - PullRequest
2 голосов
/ 07 октября 2019

Я создаю веб-сайт, используя Django, где пользователь может загрузить файл .zip. Я не знаю, сколько вложенных папок в файле или какой тип файлов он содержит.

Я хочу:

1) Разархивировать файл

2) Получить всефайл в разархивированном каталоге (который может содержать вложенные подпапки)

3) Сохраните эти файлы (содержимое, а не путь) в базу данных.

Мне удалось распаковать файл идля вывода пути к файлам.

Однако это не совсем то, что я хочу. Потому что меня не волнует путь к файлу, а сам файл. Кроме того, поскольку я сохраняю разархивированный файл в свой media/documents, если разные пользователи загружают разные zip-файлы и все zip-файлы разархивированы, папка media/documents будет огромной, и будет невозможно узнать, кто что загрузил.

Распаковка ZIP-файла

    myFile = request.FILES.get('my_uploads')
    with ZipFile(myFile, 'r') as zipObj:
       zipObj.extractall('media/documents/')

Получение пути к файлу в подпапках

    x = [i[2] for i in os.walk('media/documents/')]
    file_names = []
    for t in x:
        for f in t:
            file_names.append(f)

просмотров.py # Это не идеально, это просто идея. Я просто отлаживаю.

def homeupload(request):
    if request.method == "POST":
        my_entity = Uploading()
        # my_entity.my_uploads = request.FILES["my_uploads"]
        myFile = request.FILES.get('my_uploads')
        with ZipFile(myFile, 'r') as zipObj:
           zipObj.extractall('media/documents/')

        x = [i[2] for i in os.walk('media/documents/')]
        file_names = []
        for t in x:
            for f in t:
                file_names.append(f)
        my_entity.save()

1 Ответ

1 голос
/ 08 октября 2019

Вы действительно не должны загромождать свою файловую систему при использовании ZipFile, поскольку она содержит методы, которые позволяют вам читать файлы, хранящиеся в zip-архиве, непосредственно в память, а затем вы можете сохранить эти объекты вбаза данных.

В частности, мы можем использовать .infolist() или .namelist() для получения списка всех файлов в zip-архиве и .read() для фактического получения их содержимого:

with ZipFile(myFile, 'r') as zipObj:
    file_objects = [zipObj.read(item) for item in zipObj.namelist()]

Now file_objects - это список bytes объектов, которые содержат содержимое всех файлов. Я не удосужился сохранить имена или пути к файлам, потому что вы сказали, что это ненужно, но это тоже можно сделать. Чтобы увидеть, что вы можете сделать, проверьте, что на самом деле возвращается из infolist

Если вы хотите сохранить эти bytes объекты в вашей базе данных, обычно это возможно, если ваша база данных можетподдержать его (большинство может). Однако если вы хотите получить эти файлы в виде простого текста, а не байтов, вам просто нужно сначала преобразовать их, например, .decode:

with ZipFile(myFile, 'r') as zipObj:
    file_objects = [zipObj.read(item).decode() for item in zipObj.namelist()]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...