python - 解压缩文件并将其内容保存到数据库中
问题描述
我正在使用 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()
解决方案
使用 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()]
请注意,我们在任何时候都没有在系统上保存任何文件,因此无需担心大量用户上传的文件会弄乱您的系统。但是,磁盘上的数据库存储大小会相应增加。
推荐阅读
- python - Plotly 给出的值错误不断发生
- jquery - 使用 foreach 进行多个 Ajax 调用
- c++ - 在 C++ 中获得二维数组中前 3 名的平均值
- vue.js - 如何将图像位置传递给 Vue 中的子组件?
- c# - 调用 LoadLibrary 然后调用 FreeLibrary 会中断网络
- angular - 如何让值提供者以角度读取更新的值
- java - 对等方重置连接:套接字写入错误 - 使用 java 套接字
- typescript - tsc 没有正确检查类型相等性/可分配性
- android - 确定片段何时在 ViewPager2 中不再可见
- javascript - vue-router:路由路径类似于“employees/add”时的活动类问题