首页 > 解决方案 > 解压缩文件并将其内容保存到数据库中

问题描述

我正在使用 Django 构建一个网站,用户可以在其中上传 .zip 文件。我不知道该文件有多少个子文件夹或它包含哪种类型的文件。

我想要:

1)解压文件

2)获取解压缩目录中的所有文件(可能包含嵌套的子文件夹)

3) 将这些文件(内容,而不是路径)保存到数据库中。

我设法解压缩文件并输出文件路径。

然而,这并不是我想要的。因为我不关心文件路径,而是文件本身。另外,由于我将解压后的文件保存到我media/documents的 .zip 中,如果不同的用户上传不同的 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)

views.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()

标签: pythondjango

解决方案


使用 a 时,您真的不必弄乱文件系统ZipFile,因为它包含允许您将存储在 zip 中的文件直接读取到内存的方法,然后您可以将这些对象保存到数据库中。

具体来说,我们可以使用.infolist()or.namelist()获取 zip 中所有文件的列表,并.read()实际获取它们的内容:

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

现在file_objects是包含bytes所有文件内容的对象列表。我没有费心保存名称或文件路径,因为您说这是不必要的,但这也可以做到。要查看您可以做什么,请查看实际返回的内容 infolist

如果你想将这些bytes对象保存到你的数据库中,如果你的数据库可以支持它通常是可能的(大多数都可以)。但是,如果您想将这些文件作为纯文本而不是字节获取,则只需先将它们转换为.decode

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

请注意,我们在任何时候都没有在系统上保存任何文件,因此无需担心大量用户上传的文件会弄乱您的系统。但是,磁盘上的数据库存储大小相应增加。


推荐阅读