django通过HttpResponse返回文件 - 文件未正确提供

Tho*_*mel 14 django filestream

我想在HttpResponse中返回一些文件,我正在使用以下函数.返回的文件总是有1kb的文件大小,我不知道为什么.我可以打开文件,但似乎没有正确提供.因此,我想知道如何通过HttpResponse使用django/python返回文件.

@login_required
def serve_upload_files(request, file_url):
    import os.path
    import mimetypes
    mimetypes.init()

    try:
        file_path = settings.UPLOAD_LOCATION + '/' + file_url
        fsock = open(file_path,"r")
        #file = fsock.read()
        #fsock = open(file_path,"r").read()
        file_name = os.path.basename(file_path)
        file_size = os.path.getsize(file_path)
        print "file size is: " + str(file_size)
        mime_type_guess = mimetypes.guess_type(file_name)
        if mime_type_guess is not None:
            response = HttpResponse(fsock, mimetype=mime_type_guess[0])
        response['Content-Disposition'] = 'attachment; filename=' + file_name            
    except IOError:
        response = HttpResponseNotFound()
    return response
Run Code Online (Sandbox Code Playgroud)

编辑:这个bug实际上不是一个bug ;-)

此解决方案正在Apache服务器上进行生产,因此源可以.

在写这个问题时,我用django开发服务器在本地测试它,并想知道为什么它不起作用.我的一个朋友告诉我,如果服务器中没有设置mime类型,可能会出现此问题.但他不确定这是不是问题.但有一件事是肯定的..它与服务器有关.

alv*_*ves 12

难道该文件包含一些非ascii字符,这些字符在生产中呈现正常但不在开发中吗?

尝试将文件读取为二进制文件:

fsock = open(file_path,"rb")
Run Code Online (Sandbox Code Playgroud)

  • 你是我的救世主!通过Django提供文件的所有主要帖子都没有涵盖从Windows提供服务时的二进制必需品.顺便说一下,设置"rb"在使用FileWrapper通过以下方式工作时返回:return HttpResponse(FileWrapper(open(filename,"rb")),content_type = mimetypes.guess_type(filename)[0]) (3认同)

Ben*_*mes 10

尝试将fsock迭代器作为参数传递给HttpResponse(),而不是传递给write()我认为需要字符串的方法.

response = HttpResponse(fsock, mimetype=...)
Run Code Online (Sandbox Code Playgroud)

http://docs.djangoproject.com/en/dev/ref/request-response/#passing-iterators

另外,我不确定你想close在返回之前调用你的文件response.在shell中玩过这个(我没有在实际的Django视图中尝试过这个),似乎在读取本身response之前不会访问该文件response.尝试HttpResponse使用现在关闭的文件读取已创建的文件会导致a ValueError: I/O operation on closed file.

因此,您可能希望保持fsock打开状态,并在读取响应后让垃圾收集器处理它.