Django的文件上传终于调整了,以前对于项目的一些麻烦问题都能解决了,呵呵。
Django文件上传在更新前一直都有一个很严重的问题,就是大文件的上传,它是将上传文件存储到服务器内存中,要是文件比较大的话经常发生服务器死机的情况。
新的文件上传方式十分科学并且灵活性很强,可以根据你的设置进行不同的操作,大文件使用临时文件存储,小文件存在内存中处理。
大概看了一下,现在上传的文件封装到了一个UploadedFile 的对象中,这样在新版中访问上传文件用以前的字典访问方式可能会出错,因为一些上传文件属性都要用UploadedFile 对象中属性和方法来访问了。
主要方法: UploadedFile.read()
UploadedFile.multiple_chunks()
UploadedFile.chunks()
UploadedFile.name
UploadedFile.size
官方提供的一个例子 看过以后应该就明白了。
def handle_uploaded_file(f):
destination = open('some/file/name.txt', 'wb+')
for chunk in f.chunks():
destination.write(chunk)
其中read()和chunks()要注意以下,在使用时要知道上传对象的大小,如果文件较大使用read会引起服务器不适,因为它直接把所有文件内容读入到内存中了,chunks()将文件切割成块来存储。
新的上传方法中有几项默认配置,可以在setting中进行配置
FILE_UPLOAD_MAX_MEMORY_SIZE 文件大小处理方法分界点,超过该尺寸的使用临时文件存储
FILE_UPLOAD_TEMP_DIR 临时文件的存储位置
FILE_UPLOAD_HANDLERS 处理上传文件的方法,默认方法为:
("django.core.files.uploadhandler.MemoryFileUploadHandler",
"django.core.files.uploadhandler.TemporaryFileUploadHandler",)一个是内存处理方法, 一个是临时文件处理方法。这个设置很有灵活性,你完全可以定制自己的上传处理方法,实现各种各样的需求。文档中列取了一些应用。
You can write custom handlers that customize how Django handles files. You could, for example, use custom handlers to enforce user-level quotas, compress data on the fly, render progress bars, and even send data to another storage location directly without storing it locally.这句觉得很有用,在大量数据上传时可以通过自定义上传方法来将数据分布到本地以外的空间上存储,这样可极大的扩展存储能力。关于自定义 upload handler 的一些要求,自定义upload handlers时要在进入 request.FILES 之前,他不能在文件上传句柄开始后执行。如果在读过request.FILES之后再进行配置request.upload_handlers后 django将会报错。自定义上传处理器
所有的上传句柄都应继承自 django.core.files.uploadhandler.FileUploadHandler,之后可以进行你所要求的定制必须要包含的方法
FileUploadHandler.receive_data_chunk(self, raw_data, start)
Receives a “chunk” of data from the file upload. FileUploadHandler.file_complete(self, file_size)
Called when a file has finished uploading.
这个方法将返回一个 UploadedFile 对象并存储到 request.FILE中,bytes属性,这个属性控制 FileUploadHandler.receive_data_chunk 方法中切块的大小 FileUploadHandler.new_file(self, field_name, file_name, content_type, content_length, charset)
当一个新文件开始上传时调用。
FileUploadHandler.upload_complete(self)
所有文件上传完毕后调用该方法
FileUploadHandler.handle_raw_input(self, input_data, META, content_length, boundary, encoding) 可选方法、属性
FileUploadHandler.chunk_size
FileUploadHandler.new_file(self, field_name, file_name, content_type, content_length, charset)
FileUploadHandler.upload_complete(self)
FileUploadHandler.handle_raw_input(self, input_data, META, content_length, boundary, encoding)
这是Django新上传功能的大概理解,考虑的已经相当完善了,处理的也很完善,而且自定义性这么强,这样以后关于上传的顾虑已经没什么了。不过在 7871版本测试中发现对中文文件名文件上传时会报错,因为比较忙还没有测试最新的1.0是否还有这个问题,有空了要在研究一下源码深入了解一下具体的过 程和代码。 这个编辑器竟然还有这么严重的问题,刚才辛辛苦苦写了一大篇文章保存以后竟然只保存了一半。 可选方法和属性就不在写了。
原文链接:http://community.itbbs.cn/thread/9721/