3

我在 Django 中使用以下视图创建文件并让浏览器下载它

    def aux_pizarra(request):

        myfile = StringIO.StringIO()
        myfile.write("hello")       
        response = HttpResponse(FileWrapper(myfile), content_type='text/plain')
        response['Content-Disposition'] = 'attachment; filename=prueba.txt'
        return response

但是下载的文件总是空白的。

有任何想法吗?谢谢

4

1 回答 1

8

您必须将指针移动到缓冲区的开头seek并使用flush,以防万一没有执行写入。

from django.core.servers.basehttp import FileWrapper
import StringIO

def aux_pizarra(request):

    myfile = StringIO.StringIO()
    myfile.write("hello")       
    myfile.flush()
    myfile.seek(0) # move the pointer to the beginning of the buffer
    response = HttpResponse(FileWrapper(myfile), content_type='text/plain')
    response['Content-Disposition'] = 'attachment; filename=prueba.txt'
    return response

当您在控制台中执行此操作时会发生以下情况:

>>> import StringIO
>>> s = StringIO.StringIO()
>>> s.write('hello')
>>> s.readlines()
[]
>>> s.seek(0)
>>> s.readlines()
['hello']

在那里,您可以看到如何seek将缓冲区指针带到开头以进行读取。

希望这可以帮助!

于 2013-05-23T00:20:25.090 回答