【Django】用file.chunks()代替file.read()
阿新 • • 發佈:2019-02-06
處理上傳的檔案
從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()保證大檔案不會大量使用你的系統記憶體。