在Django中实现文件下载进度条通常需要使用Ajax来发送请求并实时获取进度,然后在前端页面上更新进度条。以下是一个简单的实现步骤:
from django.http import StreamingHttpResponse
from django.core.servers.basehttp import FileWrapper
import os
def download_file(request):
filename = 'path/to/your/file'
wrapper = FileWrapper(open(filename, 'rb'))
response = StreamingHttpResponse(wrapper, content_type='application/octet-stream')
response['Content-Length'] = os.path.getsize(filename)
response['Content-Disposition'] = f'attachment; filename={os.path.basename(filename)}'
return response
<!DOCTYPE html>
<html>
<head>
<title>Download File Progress</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<div id="progress"></div>
<button id="download">Download File</button>
<script>
$(document).ready(function() {
$('#download').click(function() {
var xhr = new XMLHttpRequest();
xhr.open('GET', '/download_file/', true);
xhr.responseType = 'blob';
xhr.onload = function(e) {
if (this.status == 200) {
var blob = new Blob([this.response]);
var url = window.URL.createObjectURL(blob);
var a = document.createElement('a');
a.href = url;
a.download = 'downloaded_file.txt';
a.click();
window.URL.revokeObjectURL(url);
}
};
xhr.onprogress = function(e) {
if (e.lengthComputable) {
var percent = (e.loaded / e.total) * 100;
$('#progress').text(percent.toFixed(2) + '%');
}
};
xhr.send();
});
});
</script>
</body>
</html>
在上面的代码中,当用户点击"Download File"按钮时,会触发Ajax请求来下载文件,并且实时获取下载进度。进度条显示在页面中的progress
元素中。
请注意,以上示例仅供参考,具体实现方式可能会因项目需求而有所不同。