Django Служит для загрузки файла

Я пытаюсь использовать txt файл, сгенерированный с некоторым контентом, и у меня возникают некоторые проблемы. Я создал временные файлы и написал контент с помощью NamedTemporaryFile и просто установил delete в false для отладки, однако загруженный файл не содержит ничего.

Я предполагаю, что значения ответа не указываются на правильный файл, а ничто не загружается, вот мой код:

    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

Ответ 1

Рассматривали ли вы просто отправку p.body через response следующим образом:

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

Ответ 2

XSend требует пути к файлу в response['X-Sendfile'] Итак, вы можете сделать

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

Здесь path_to_file - это полный путь к файлу (а не только имя файла) Оформить заказ django-snippet

Ответ 3

В вашем подходе может быть несколько проблем:

  • содержимое файла не нужно очищать, добавьте f.flush(), как указано в комментарии выше.
  • NamedTemporaryFile удаляется при закрытии, что может произойти так же, как вы выходите из своей функции, поэтому веб-сервер не имеет возможности забрать его.
  • временное имя файла может быть вне путей, для которых веб-сервер настроен для отправки с помощью X-Sendfile

Возможно, было бы лучше использовать StreamingHttpResponse вместо создания временных файлов и X-Sendfile...

Ответ 4

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