файл возврата django по HttpResponse - файл не подается правильно

Я хочу возвратить некоторые файлы в 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 сервером разработки и задавался вопросом, почему это не работает. Мой друг сказал мне, что эта проблема могла возникнуть, если типы пантомимы не установлены в сервере. Но он не был уверен, является ли это проблемой. Но одна вещь наверняка.. это имеет некоторое отношение к серверу.

14
задан tufelkinder 30 August 2016 в 00:55
поделиться

1 ответ

Попробуйте передать итератор fsock в качестве параметра HttpResponse () , а не его методу write () , который, как мне кажется, ожидает строку.

response = HttpResponse(fsock, mimetype=...)

См. http://docs.djangoproject.com/en/dev/ref/request-response/#passing-iterators

Кроме того, я не уверен, что вы хотите позвонить close в вашем файле, прежде чем вернуть ответ . Поигравшись с этим в оболочке (я не пробовал это в реальном представлении Django), кажется, что ответ не обращается к файлу, пока сам ответ не будет читать. Попытка прочитать HttpResponse , созданный с использованием закрытого файла, приводит к ошибке ValueError: операция ввода-вывода для закрытого файла .

Итак, вы можете оставить fsock открытым и позволить сборщику мусора обработать его после прочтения ответа.

10
ответ дан 1 December 2019 в 12:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: