arturomp
arturomp

Reputation: 29590

generating a file with django to download with javascript/jQuery

Using Django, I want to make some data available for download.

My jQuery call looks like this so far:

$.getJSON("/get_data", 
            { users: users, study: "{{study.id}}" } ,
            function(json){
                alert('some data!');
            }
);

This calls one of my Django views, which in turn generates some JSON and attempts to make that JSON text in a file to download

jsonResponse = json.dumps(data, cls=DjangoJSONEncoder)

jsonFile = cStringIO.StringIO()
jsonFile.write(jsonResponse)

response = HttpResponse(jsonFile, mimetype='application/json')
response['Content-Disposition'] = 'attachment; filename=data.txt'

return response

However, this does not work. After looking around for a while, I believe I should change something on both ends – the Javascript and the python/Django code – but I'm unclear what exactly.

For Python, my main concern is in the use of cStringIO (especially the fact that I cannot execute close on jsonFile before returning without prompting a "ValueError: I/O operation on closed file").

Maybe I should also be using a FileWrapper (like in this post), but I get identical results with and without it.

For Javascript, I'm not sure what should go into my success handler function.

Any pointers would be greatly appreciated!

Upvotes: 6

Views: 5760

Answers (1)

xbtsw
xbtsw

Reputation: 734

The classic solution for this is to use an hidden iframe.

In your urls.py

url(r'^test/getFile', 'getFile')

In your views.py

def getFile(request):
    fileContent = "Your name is %s" % request.GET['name']
    res = HttpResponse(fileContent)
    res['Content-Disposition'] = 'attachment; filename=yourname.txt'
    return res

On your page

<script type="text/javascript">
    var data = {name: 'Jon'};
    $(function(){
        $("body").append('<iframe src="/test/getFile?'+ $.param(data) + '" style="display: none;" ></iframe>');
    });
</script>

Upvotes: 8

Related Questions