2013-04-03 17 views
12

Sto provando a pubblicare un file txt generato con alcuni contenuti e sto avendo alcuni problemi. Ho creato i file temporanei e scritto il contenuto usando NamedTemporaryFile e ho appena impostato delete su false per debug ma il file scaricato non contiene nulla.Django che serve un file di download

La mia ipotesi è i valori di risposta non sono puntate al file corretto, hense niente viene scaricato, ecco il mio codice:

f = NamedTemporaryFile() 
    f.write(p.body) 

    response = HttpResponse(FileWrapper(f), mimetype='application/force-download') 
    response['Content-Disposition'] = 'attachment; filename=test-%s.txt' % p.uuid 
    response['X-Sendfile'] = f.name 
+0

Non dimenticare di scaricare il file: f.flush, prima di ogni altra cosa. – dsign

+0

Per ulteriori dettagli sulla pubblicazione dei file con Django, vedere: http://stackoverflow.com/q/1156246/462865 –

risposta

19

Avete preso in considerazione solo l'invio p.body attraverso il response in questo modo:

response = HttpResponse(mimetype='text/plain') 
response['Content-Disposition'] = 'attachment; filename="%s.txt"' % p.uuid 
response.write(p.body) 
+1

In Django 1.9 dovrebbe essere response = HttpResponse (p.body, content_type = 'text/plain'); risposta ['Content-Disposition'] = 'allegato; filename = "% s.txt" '% p.uuid –

3

XSend richiede il percorso del file in response['X-Sendfile'] Quindi, è possibile fare

response['X-Sendfile'] = smart_str(path_to_file) 

Qui, path_to_file è il percorso completo del file (non solo il nome del file) Checkout questo django-snippet

+0

Ho ammesso il codice: "risposta ['X-Sendfile'] = smart_str (f.name)" ancora ancora niente, devo usare qualcosa di diverso da f.name? – Callum

+0

Ha bisogno del percorso completo, non solo di 'f.name' - a meno che non stiate memorizzando il percorso assoluto in' f.name'? – karthikr

+0

NamedTemporaryFile crea percorsi assoluti –

1

Ci possono essere diversi problemi con il vostro approccio:

  • contenuto del file non deve necessariamente essere lavati, aggiungere f.flush() come menzionato nel commento sopra
  • NamedTemporaryFile viene eliminato alla chiusura, cosa potrebbe accadere proprio quando si esce dalla funzione, quindi il server web non ha alcuna possibilità di prenderlo
  • nome di file temporanei potrebbe essere fuori di percorsi che è configurato web server per inviare utilizzando

Forse sarebbe meglio utilizzare StreamingHttpResponse invece di creare file temporanei e ...

1
import urllib2; 
url ="http://chart.apis.google.com/chart?cht=qr&chs=300x300&chl=s&chld=H|0"; 
opener = urllib2.urlopen(url); 
mimetype = "application/octet-stream" 
response = HttpResponse(opener.read(), mimetype=mimetype) 
response["Content-Disposition"]= "attachment; filename=aktel.png" 
return response 
Problemi correlati