如何在Python Django中保存POST变量中的文件数据并将其加载回响应?
我有这样一个问题——我使用的是Python 2.6/Django 1.3,我需要接受带有键“f”的POST变量,它包含二进制数据。之后,我需要将数据保存到文件中 发布如何在Python Django中保存POST变量中的文件数据并将其加载回响应?,python,django,httpresponse,Python,Django,Httpresponse,我有这样一个问题——我使用的是Python 2.6/Django 1.3,我需要接受带有键“f”的POST变量,它包含二进制数据。之后,我需要将数据保存到文件中 发布 T$topX$objectsX$versionY$archiverО©ҐR$0О©ҐО©ҐО©Ґull_=<---------------------- content of file -------------------->О©ҐО©Ґ_NSKeyedArchive(258:=CО©ҐО©Ґ 当我试着去做的时候
T$topX$objectsX$versionY$archiverО©ҐR$0О©ҐО©ҐО©Ґull_=<---------------------- content of file -------------------->О©ҐО©Ґ_NSKeyedArchive(258:=CО©ҐО©Ґ
当我试着去做的时候
nano /tmp/myfile.zip
它返回的数据如下
T^@^@^@$^@^@^@t^@^@^@o^@^@^@p^@^@^@X^@^@^@$^@^@^@o^@^@^@b^@^@^@j^@^@^@e^@^@^@c^@^@^@t^@^@^@s^@^@^@X^@^@^@$^@^@^@v^@^@^@e^@^@^@r^@^@^@s^@^@^@i^@^@$
完成后,我将读取保存的文件
def read(request):
user_file = default_storage.open(file_path).read()
file_name = get_filename(file_path)
response = HttpResponse(user_file, content_type = 'text/plain',
mimetype = 'application/force-download')
response['Content-Disposition'] = 'attachment; filename=%s' % file_name
response['Content-Length'] = default_storage.size(file_path)
return response
万一我在写作的时候
print user_file
它返回一个正确的数据,但当我返回一个HttpResponse时,它有一个不同的源数据,如果您只将数据保存到一个文件中,并且像@keckse所说的,让浏览器流式处理它,可能会更容易,内存效率更高。Django在流数据方面效率非常低。这一切都取决于数据的大小。如果您想以任何方式使用django对其进行流式处理,可以这样做:
from django.http import HttpResponse
import os.path
import mimetypes
def stream(request, document, type=None):
doc = Document.objects.get(pk=document)
fsock = open(doc.file.path,"r")
file_name = os.path.basename(doc.file.path)
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
return response
在您的情况下,您可能希望手动设置mime类型,您也可以尝试应用程序/八位字节流。主要传递迭代器的区别在于,您从file.read()传递“字符串”,而不是直接向文件传递句柄。请注意:如果使用read(),将把整个文件加载到内存中
更多关于HttpResonse的信息。我可能错了,但我认为您可以放弃。您应该提供文件的URI,让真正的Web服务器(如Apache)提供静态文件。另外请注意,出于安全考虑,强烈建议在保存之前检查上传的文件。在这种情况下,我只需要接受数据,保存并在一段时间后返回。请,您能为我推荐一个解决方案吗?目前我只能找到一个解决方案:-保存文件后,在本地文件系统中返回指向该文件的链接-客户端(即flash或其他)将要求nginx提供静态文件
from django.http import HttpResponse
import os.path
import mimetypes
def stream(request, document, type=None):
doc = Document.objects.get(pk=document)
fsock = open(doc.file.path,"r")
file_name = os.path.basename(doc.file.path)
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
return response