民间,
我有一个可以解决的问题,但我不愿意。
我刚刚重写了我的图库应用程序,使用基于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)
按预期工作。
我正盯着代码,答案就在我面前。
答案 0 :(得分:0)
见最后编辑。结束问题。