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)
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
打开状态,并在读取响应后让垃圾收集器处理它.