1. 程式人生 > >【Django】用file.chunks()代替file.read()

【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()保證大檔案不會大量使用你的系統記憶體。