【问题标题】:Unzip a file and save its content into a database解压缩文件并将其内容保存到数据库中
【发布时间】:2019-10-08 14:27:28
【问题描述】:

我正在使用 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)

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

【问题讨论】:

  • 不清楚,要保存到数据库中的是什么?只有文件名或内容?你的数据库方案是什么?是否要参考用户保存每个文件?
  • 你真的需要打电话给ZipFile.extractall吗?该类提供了访问文件的方法,而无需将整个内容提取到文件系统中。看看ZipFile.infolistZipFile.read
  • 我需要在数据库中保存每个文件的内容,而不是路径名。最好参考主 zip 文件。

标签: python django


【解决方案1】:

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

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

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

现在file_objects 是包含所有文件内容的bytes 对象列表。我没有费心保存名称或文件路径,因为您说这是不必要的,但也可以这样做。看看你能做什么,check out what actually get's returned frominfolist

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-13
    • 2011-10-27
    • 2016-03-31
    • 2014-05-22
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2019-12-25
    相关资源
    最近更新 更多