如何在 Django 中压缩多个上传的文件,然后再将其保存到数据库?
Posted
技术标签:
【中文标题】如何在 Django 中压缩多个上传的文件,然后再将其保存到数据库?【英文标题】:How to zip multiple uploaded file in Django before saving it to database? 【发布时间】:2020-02-25 14:53:18 【问题描述】:我正在尝试在使用 Django 将文件夹保存到数据库/文件存储系统之前对其进行压缩。对于这个任务,我正在使用 ZipFile 库。这是view.py的代码:
class BasicUploadView(View):
def get(self, request):
file_list = file_information.objects.all()
return render(self.request, 'fileupload_app/basic_upload/index.html','files':file_list)
def post(self, request):
zipfile = ZipFile('test.zip','w')
if request.method == "POST":
for upload_file in request.FILES.getlist('file'): ## index.html name
zipfile.write(io.BytesIO(upload_file))
fs = FileSystemStorage()
content = fs.save(upload_file.name,upload_file)
data = 'name':fs.get_available_name(content), 'url':fs.url(content)
zipfile.close()
return JsonResponse(data)
但我收到以下错误:
TypeError: a bytes-like object is required, not 'InMemoryUploadedFile'
这个问题有什么解决办法吗?由于我可能需要上传包含大文件的文件夹,我是否必须为此编写自定义 TemporaryFileUploadHandler ?我最近开始使用 Django,它对我来说很新。请给我一些建议。
【问题讨论】:
【参考方案1】:InMemoryUploadedFile
是一个对象,它包含的不仅仅是文件,您应该打开文件并读取它的内容(InMemoryUploadedFile.file 是文件)
InMemoryUploadedFile.open()
你应该用 open() 打开文件然后 read() 它的内容,你还应该检查你是否正确上传了文件,你也可以使用 zip 和 file 的语法 https://www.pythonforbeginners.com/files/with-statement-in-python
【讨论】:
我尝试使用zipfile.write(upload_file.file)
来读取内存文件的内容。它给了我这个错误:TypeError: stat: path should be string, bytes, os.PathLike or integer, not _io.BytesIO
我也用过zipfile.writestr(upload_file.name,upload_file.read())
。它仅使用最新上传的文件创建了一个 zip 文件(因为我选择了多个要上传的文件)。而且文件里面也是空的。我真的不明白该怎么办。
你应该用 open() 打开文件然后 read() 它的内容,你还应该检查你是否正确上传了文件,你也可以使用 zip 和文件 pythonforbeginners.com/files/with-statement-in-python 的语法跨度>
以上是关于如何在 Django 中压缩多个上传的文件,然后再将其保存到数据库?的主要内容,如果未能解决你的问题,请参考以下文章
在没有数据持久性的情况下,如何最好地在 Django 中压缩表单:最 Djangonic 的方法是啥? [关闭]