Django скачать файл пустой
Вопрос
Я пишу простую функцию для загрузки определенного файла, с сервера, на мою машину. Файл уникален, представленный его идентификатором. Файл локация Corecty, и загрузка сделана, но загруженный файл (хотя с именем, как тот на сервере) пусто. Моя функция загрузки выглядит так:
def download_course(request, id):
course = Courses.objects.get(pk = id).course
path_to_file = 'root/cFolder'
filename = __file__ # Select your file here.
wrapper = FileWrapper(file(filename))
content_type = mimetypes.guess_type(filename)[0]
response = HttpResponse(wrapper, content_type = content_type)
response['Content-Length'] = os.path.getsize(filename)
response['Content-Disposition'] = 'attachment; filename=%s/' % smart_str(course)
return response
Где я могу ошибиться? Спасибо!
Решение
Я ответил на этот вопрос здесь, Надеюсь, поможет.
Другие советы
Похоже, вы не отправляете какие-либо данные (вы даже не открываете файл).
У Django есть хорошая обертка для отправки файлов (код, взятый из djangosnippets.org.):
def send_file(request):
"""
Send a file through Django without loading the whole file into
memory at once. The FileWrapper will turn the file object into an
iterator for chunks of 8KB.
"""
filename = __file__ # Select your file here.
wrapper = FileWrapper(file(filename))
response = HttpResponse(wrapper, content_type='text/plain')
response['Content-Length'] = os.path.getsize(filename)
return response
так что вы могли бы использовать что-то вроде response = HttpResponse(FileWrapper(file(path_to_file)), mimetype='application/force-download')
.
Если вы действительно используете Lighttpd (из-за "X-sendfile" Главный заголовок), вы должны проверить конфигурацию сервера и FastCGI, я думаю.
Попробуйте один из этих подходов:
1) отключить gzipmiddleware, если вы его используете;
2) Примените патч в Django / Core / Servers / basehttp.py, описанный вhttps://code.djangoproject.com/ticket/6027.