本文介绍的 Django 文件上传不是 Django 1.0 以上的上传方法,而是一般通用的文件上传。主要使用 HttpRequest 对象的 FILES 属性,一个类似字典的属性。
FILES
是一个包含所有上传文件的类似于字典的对象,它里面的每个 key 的名称来自于表单输入控件 <input type="file" name="" /> 中的 name 属性。每个 key 的值为标准的 Python 字典,其里面又包含以下三个 Key-Value 键值对:
- filename: 上传的文件的名字。
- content-type: 上传文件的类型。
- content: 上传文件的原始内容
注意:只要在表单中指定提交方式为 POST,而且有 enctype="multipart/form-data" 这个属性,FILES 对象不为空。
处理上传文件的内容
也就是我们需要保存 FILES 中 content 的内容到磁盘上,核心的方法如以下这段代码:
def saveUploadFile (file_obj, types=(), size=524288):
'''
处理上传文件 v1.0
可设置上传文件类型: types
可设置上传文件大小: size
@magicalboy 10.8.3
'''
from fileupload.settings import MEDIA_ROOT
from os import makedirs
from os.path import isdir, exists, dirname
if types: # 判断是否限制上传文件类型
if not file_obj['content-type'] in types: # 判断上传的文件类型
return False, "不允许上传的文件类型!"
buf = file_obj['content']
if len(buf) < size: # 判断上传文件大小
filename = file_obj['filename']
savePath = '%s/%s' % (MEDIA_ROOT, filename.decode('utf8'))
dir = dirname(savePath)
if not isdir(dir): # create archive dir if nec.
makedirs(dir)
f = open(savePath, 'wb+')
f.write(buf)
f.close()
return True, ""
else:
return False, "上传文件不能大于 %d K!" % size
完整源代码下载:
fileupload.zip测试环境:
WinXP + Python 2.4 + Django 9.05运行效果:


楼主大牛逼啊,差点给这个问题搞死了
你这个是用户上传文件之后才判断文件大小的吧。 要是用户直接上传一个2G甚至更大的文件呢?
这种方法只适用于上传小文件,图片等。 如果要上传大文件可通过file写js脚本,进行判断