【Django】用file.chunks()代替file.read()

处理上传的文件

  从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()保证大文件不会大量使用你的系统内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值