Я хочу возвратить некоторые файлы в HttpResponse, и я использую следующую функцию. Файл, который возвращается всегда, имеет размер файла 1 КБ, и я не знаю почему. Я могу открыть файл, но кажется, что это не подается правильно. Таким образом я хотел знать, как можно возвратить файлы с django/python по HttpResponse.
@login_required
def serve_upload_files(request, file_url):
import os.path
import mimetypes
mimetypes.init()
try:
file_path = settings.UPLOAD_LOCATION + '/' + file_url
fsock = open(file_path,"r")
#file = fsock.read()
#fsock = open(file_path,"r").read()
file_name = os.path.basename(file_path)
file_size = os.path.getsize(file_path)
print "file size is: " + str(file_size)
mime_type_guess = mimetypes.guess_type(file_name)
if mime_type_guess is not None:
response = HttpResponse(fsock, mimetype=mime_type_guess[0])
response['Content-Disposition'] = 'attachment; filename=' + file_name
except IOError:
response = HttpResponseNotFound()
return response
Править: Ошибка является на самом деле не ошибкой ;-)
Это решение работает в производстве над апачским сервером, таким образом источник в порядке.
При записи этого вопроса я протестировал его локальный с django сервером разработки и задавался вопросом, почему это не работает. Мой друг сказал мне, что эта проблема могла возникнуть, если типы пантомимы не установлены в сервере. Но он не был уверен, является ли это проблемой. Но одна вещь наверняка.. это имеет некоторое отношение к серверу.
Попробуйте передать итератор fsock
в качестве параметра HttpResponse ()
, а не его методу write ()
, который, как мне кажется, ожидает строку.
response = HttpResponse(fsock, mimetype=...)
См. http://docs.djangoproject.com/en/dev/ref/request-response/#passing-iterators
Кроме того, я не уверен, что вы хотите позвонить close
в вашем файле, прежде чем вернуть ответ
. Поигравшись с этим в оболочке (я не пробовал это в реальном представлении Django), кажется, что ответ
не обращается к файлу, пока сам ответ
не будет читать. Попытка прочитать HttpResponse
, созданный с использованием закрытого файла, приводит к ошибке ValueError: операция ввода-вывода для закрытого файла
.
Итак, вы можете оставить fsock
открытым и позволить сборщику мусора обработать его после прочтения ответа.