提供一次性URL让人们下载文件的 Django/Python 解决方案是什么?

2024-05-12 23:54:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种方法,在一个活动,将有一个独特的代码,他们将能够使用,以便下载一个文件(mp3,pdf等)只有一次,并掩盖真正的文件位置,这样一个明智的人下载文件将不能不止一次。最好将文件托管在amazons3上,这样可以节省服务器所在位置的带宽。在

我对代码的想法是预先生成将打印在卡片上的唯一代码,并将这些代码存储在数据库中,该数据库还可以有一个存储文件下载次数的字段。这样我们就可以设置允许用户下载文件的尝试次数。在

我需要说明的是如何隐藏/屏蔽原始文件位置,这样人们就不能窃取该url,然后根据需要下载文件。我做过谷歌搜索,我不是没有用正确的关键字搜索,就是没有太多的库或代码片段可以找到这种类型的东西。在

我猜我可以使用django.views.static.serve来装配一些东西,它充当实际文件和下载文件的用户之间的某种代理。我认为这种方法的唯一缺点是需要使用实际的web服务器,并且无法将文件存储在amazons3上。在

如有任何建议或想法,我们将不胜感激。在


Tags: 文件方法代码用户服务器数据库urlpdf
2条回答

你可以使用一些简单的东西,比如mod_xsendfile。此功能也可用于其他流行的web服务器,如lighttpdnginx。在

它的工作原理是这样的:当启用时,应用程序(例如一个简单的PHP脚本)可以发送一个特殊的响应头,从而使web服务器服务于一个静态文件。在

如果你想让它与S3一起工作,你需要用这种方式处理每一个请求,这意味着流量将通过你的站点,从那里到AWS,再回到你的站点,再回到客户端。S3是否支持符号链接/别名?如果是这样的话,您可以将一个有效的用户重定向到其中一个符号url,并在几个小时后删除该符号链接。在

好主意。但是,我要警告不要使用单一下载方法,因为不能保证他们的第一次下载尝试会成功。也许用一个时间过期方法代替?在

但用Django做这个当然是可能的。以下是基本方法的概述:

  • 为这些文件设置一个django url
  • 使用GET参数(该参数是唯一的字符串)来标识要获取的文件。在
  • 保留一个包含FileField的数据库表供文件下载。此表将唯一字符串映射到文件系统上的文件位置。在
  • 要将文件用作下载,请在视图中按如下方式设置响应头:

path是要服务的文件的位置)

with open(path, 'rb') as f:
    response = HttpResponse(f.read())
response['Content-Type'] = 'application/octet-stream';
response['Content-Disposition'] = 'attachment; filename="%s"' % 'insert_filename_here'
return response

因为我们使用这个Django页面来服务文件,所以用户无法找到原始文件的位置。在

相关问题 更多 >