Django内联下载未在浏览器中正确显示文件名

Django内联下载未在浏览器中正确显示文件名,django,Django,我遇到了一个我无法解释的奇怪现象,除了它是一个内联的,而不是一个附件 def respond_as_inline(request, file_path, original_filename, ranged=False): # https://stackoverflow.com/questions/36392510/django-download-a-file # https://stackoverflow.com/questions/27712778/video-plays-in

我遇到了一个我无法解释的奇怪现象,除了它是一个内联的,而不是一个附件

def respond_as_inline(request, file_path, original_filename, ranged=False):
    # https://stackoverflow.com/questions/36392510/django-download-a-file
    # https://stackoverflow.com/questions/27712778/video-plays-in-other-browsers-but-not-safari
    # https://stackoverflow.com/questions/720419/how-can-i-find-out-whether-a-server-supports-the-range-header
    filename = os.path.join(file_path, original_filename)
    if os.path.exists(filename):
        mtype, encoding = mimetypes.guess_type(original_filename)
        if mtype is None:
            mtype = 'application/octet-stream'

        with open(filename, 'rb') as fh:
            if ranged:
                response = RangedFileResponse(request, file=open(filename, 'rb'), as_attachment=False, filename=original_filename)
                response["Content-Type"] = mtype
            else:
                response = HttpResponse(fh.read(), content_type=mtype)
                response['Content-Disposition'] = 'inline; filename=%s'% original_filename
        return response    
    else:
        print("File not found")
    raise Http404
现在,除了使用内联附件,浏览器显示的文件名是url名称(UUID),而不是文件名(例如,原始文件名)之外,一切正常

如果我将其更改为附件,则在下载时会检测到/使用正确的文件名

谁有好的答案/解决方案


不,根据设计,这是内联的,因此PDF、图形等可以在浏览器中查看。如果我可以将其作为附件,默认设置是保存到磁盘。这对平板电脑没有帮助。

好吧,我怀疑这一点,但从技术上讲,一个内联的“附件”,虽然在标题中包含一个文件名,但被浏览器视为来自URL。因此URL实际上(imho)覆盖了文件名

所以这在技术上不是Django的问题,而是web浏览器的问题

此堆栈溢出线程:

把我放在“正确”的轨道上

而不是http://servername/download/(uuid)

我已将URL改写为:

http://servername/download/filename?UUID=(uuid)

该文件名显示在浏览器中,但Django实际上并未使用。UUID是服务器使用的唯一数据。所以,这从美容上解决了这个问题

我不喜欢这个解决方案,但它很简单,而且有效

但如果有人有更优雅的解决方案,或者想指出一些问题,请随时