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

标签 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

编辑:
该错误实际上不是错误;-)

该解决方案正在 apache 服务器上进行生产,因此源代码没问题。

在写这个问题时,我使用 django 开发服务器在本地对其进行了测试,并且想知道为什么它不起作用。我的一位 friend 告诉我,如果服务器中未设置 mime 类型,则可能会出现此问题。但他不确定这是否是问题所在。但可以肯定的一件事..它与服务器有关。

最佳答案

尝试通过 fsock迭代器作为 HttpResponse() 的参数,而不是其write()我认为需要一个字符串的方法。

response = HttpResponse(fsock, mimetype=...)

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

另外,我不确定您是否想调用 close在返回 response 之前保存在您的文件中.在 shell 中玩过这个(我没有在实际的 Django View 中尝试过),似乎 response直到 response 才访问文件本身被读取。试图阅读 HttpResponse使用现在关闭的文件创建的结果是 ValueError: I/O operation on closed file .

所以,你可能想离开 fsock打开,并在读取响应后让垃圾收集器处理它。

关于django 通过 HttpResponse 返回文件 - 文件未正确提供,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2538345/

相关文章:

c# - 写入使用 AsciiEncoding.GetBytes 和 Convert.FromBase64String 解码的字节时 FileStream.Write 中的性能问题

c# - 数据写入流时的事件?

c++ - C++中的基本文件处理,EOF检测

django - 在 Django 中捕获 KeyError 的正确方法?

python - 安装Django 1.9导致的pip错误

django - 如何让 Google Oauth2 身份验证与 Extra Scopes 一起工作?

c# - 流阅读器无法将文本从文件文本获取到文本框

javascript - 使用javascript重定向django url

阿拉伯语和其他外语的 Django slug 字段

c# - C# 中的 Stream Empty 读取并上传 Excel 文件