Django使用基于UUID的下载

时间:2018-04-28 00:38:16

标签: django

民间,

我有一个可以解决的问题,但我不愿意。

我刚刚重写了我的图库应用程序,使用基于UUID的数据库索引进行下载。例如

url(r'^(?i)download/(?P<d_uuid>.+)/',
    frontend.views.new_download,
    name="downloads"),

因此,下载/将通过搜索UUID来查找文件,然后将其提供。 但是浏览器保存的文件名是UUID,而不是文件的实际文件名。

`def new_download(request,d_uuid = None):

download = index_data.objects.filter(uuid=d_uuid,
                                     ignore=False,
                                     delete_pending=False)[0]

print ("\tDownloading - %s, %s" % (download.fqpndirectory.lower(), download.name))
return serve(request,
             download.name,
             download.fqpndirectory.lower())

`

在切换到使用UUID搜索之前,这工作正常。似乎浏览器(firefox,Safari等)正在从GET中获取文件名,并忽略正在传递的文件名。

现在,我尝试过使用,而不是服务。以下代码专门将文件名添加到响应中,但被忽略

`respond_as_attachment(request,download.fqpndirectory,download.name)

def respond_as_attachment(request, file_path, original_filename):
#   https://www.djangosnippets.org/snippets/1710/
#   print ("original filename: ", original_filename)
    filename = os.path.join(file_path, original_filename) 
    fp = open(filename, 'rb')
    response = HttpResponse(fp.read())
    fp.close()
    type, encoding = mimetypes.guess_type(original_filename)
    if type is None:
        type = 'application/octet-stream'
    response['Content-Type'] = type
    print (response['Content-Type'])
    response['Content-Length'] = str(os.stat(filename).st_size)
    if encoding is not None:
        response['Content-Encoding'] = encoding
    filename_header='filename="%s"' % original_filename
    response['Content-Disposition'] = 'attachment; ' + filename_header
    return response

`

行为没有任何改变。我很难过......

UUID开关允许我简化代码。

现在我可以沿着这一行编写传入的请求:

http://servername/download/filename?uuid=uuid

并有效地忽略文件名部分。对于日志文件来说实际上会更好(因为文件名将显示在日志中而不是仅显示在UUID中)。

有人有什么建议吗?是的,我知道不建议使用服务,但我需要在开发环境和生产环境中工作(Apache w / mod_wsgi)。

当前代码 NOT 尚未在GitHub上发布 - https://github.com/bschollnick/QuickBBS。当前的快照来自切换UUID方案之前。我希望在接下来的几天内完成UUID方案代码,一旦我完成切换,并调试了这样的问题。

    - Benjamin

编辑#3:

已解决 - 测试时,我没有为new_download调用添加返回值。

print ("\tDownloading - %s, %s" % (download.fqpndirectory.lower(), download.name))
**respond_as_attachment**(request, configdata["locations"]["albums_path"] + os.sep + download.fqpndirectory, download.name)
return serve(request,
             download.name,
             download.fqpndirectory.lower())

这意味着代码通过了respond_as_attachment,但它没有被发送到服务器,这意味着我正在从serve命令接收下载。

相反:

print ("\tDownloading - %s, %s" % (download.fqpndirectory.lower(), download.name))
**return** respond_as_attachment(request, configdata["locations"]["albums_path"] + os.sep + download.fqpndirectory, download.name)

按预期工作。

我正盯着代码,答案就在我面前。

1 个答案:

答案 0 :(得分:0)

见最后编辑。结束问题。