我目前正在编写一个使用 nginx 服务的小型个人使用网站,使用 uwsgi、django 和 bootstrap。一切都很顺利,除了一个我无法弄清楚的问题。我在网站上有下载链接(按钮),点击后应该会启动文件下载。这是按下按钮时执行的视图:
@login_required
def download_file(request):
'''
downloads a file given a specified UUID
'''
if request.method == 'GET':
file_uuid = request.GET['file_id']
file_row = Files.objects.get(uuid=file_uuid)
file_name = file_row.file_name
response = HttpResponse()
response['Content-Disposition'] = 'attachment; filename=%s' % file_name
response['X-Accel-Redirect'] = '/media/files/%s' % file_name
return response
else:
return redirect('/files')
/media/files 直接由 nginx 作为内部位置提供服务:
location /media/files/ {
internal;
alias /mnt/files/;
}
如何使用分配给每个按钮的 onclick 事件调用此视图:
$('.download_btn').on('click',function(){
download_file(this.id);
})
function download_file(uuid){
$('.file_id').val(uuid);
$('.get_file').submit();
}
我有一个带有单个隐藏字段的表单。这被设置为按下的按钮的 id (uuid)。
很简单吧?我的问题是,当按下下载按钮时,下载没有正确启动。用户不会收到保存对话框提示,文件也不会开始自动下载(Chrome 或 Safari)。相反,在调试工具中,我可以看到文件下载到浏览器中的本地存储或某个内存位置(这些是大文件;> 1GB)。我看到内存在膨胀,最终浏览器会崩溃。任何线索我在这里做错了什么?根据我一直在阅读的内容,这应该可以正常工作。