处理上传的文件
从request.FILES中获得的真实的文件。这个字典的每个输入都是一个UploadedFile对象——一个上传之后的文件的简单的包装。
你通常会使用下面的几个方法来访问被上传的内容:
- UploadedFile.read():从文件中读取整个上传的数据。小心整个方法:如果这个文件很大,你把它读到内存中会弄慢你的系统。你可以想要使用chunks()来代替,看下面;
- UploadedFile.chunks():如果上传的文件足够大需要分块就返回真。默认的这个值是2.5M,当然这个值是可以调节的。
下面是本人写的一个简单的例子:
<form id="myform" enctype="multipart/form-data">
<span>选择上传的文件</span><input type="file" id="upload" name="myfiles" multiple><br/>
<input id="submit" type="button" value="上传">
</form>
<script>
$(document).ready(function(){
$("#submit").click(function () {
var form_data = new FormData();
var len = $('#upload')[0].files.length;
for(var i =0;i<len;i++) {
var file_info = $('#upload')[0].files[i];
form_data.append('myfiles', file_info);
}
$.ajax({
url:'upload/', // 这里对应url.py中的 url(r'upload', views.upload)
type:'POST',
data: form_data,
processData: false, // tell jquery not to process the data
contentType: false, // tell jquery not to set contentType
success: function(callback) {
alert('success');
}
});
});
});
</script>
//uploadfile.views.py
from django.http import HttpResponse
def upload(request):
if request.method == 'POST':
files = request.FILES.getlist('myfiles')
for f in files:
file = open('file/' + f.name, 'wb+')
for chunk in f.chunks():
file.write(chunk)
file.close()
return HttpResponse("OK!")
else:
return HttpResponse("NOT OK!")
//urls.py
from uploadfile import views
在f.chunks()上循环而不是用read()保证大文件不会大量使用你的系统内存。