如何在Python Django中保存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О©ҐО©Ґ 当我试着去做的时候

我有这样一个问题——我使用的是Python 2.6/Django 1.3,我需要接受带有键“f”的POST变量,它包含二进制数据。之后,我需要将数据保存到文件中

发布

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