3

我目前正在编写一个使用 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)。我看到内存在膨胀,最终浏览器会崩溃。任何线索我在这里做错了什么?根据我一直在阅读的内容,这应该可以正常工作。

4

0 回答 0