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

【Django】用file.chunks()代替file.read()处理上传的文件  从request.FILES中获得的真实的文件。这个字典的每个输入都是一个UploadedFile对象——一个上传之后的文件的简单的包装。你通常会使用下面的几个方法来访问被上传的内容:UploadedFile.read():从文件中读取整个上传的数据。小心整个方法:如果这个文件很大,你把它读到内存中会弄慢你的系统。你可以想要使用chunks()来代替,看下面;Up

处理上传的文件

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

今天的文章【Django】用file.chunks()代替file.read()分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/6082.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注