кодировка пирамиды FileResponse

Я пытаюсь обслуживать файлы изображений в кодировке base64 и терплю неудачу. Либо я получаю ответы в кодировке UTF-8, либо в строке return response ошибки интересным образом. В основном все, что я пробовал, можно увидеть как закомментированный код в отрывке ниже. Детали трассировки следуют за этим.

Мой вопрос: как я могу вернуть файлы в кодировке base64?

        #import base64
        #with open(sPath, "rb") as image_file:
            #encoded_string = base64.b64encode(image_file.read())
        dContentTypes = {
        'bmp'   : 'image/bmp',
        'cod'   : 'image/cis-cod',
        'git'   : 'image/gif',
        'ief'   : 'image/ief',
        'jpe'   : 'image/jpeg',
        .....
        }
        sContentType = dContentTypes[sExt]
        response = FileResponse(
                            sPath,
                            request=request,
                            content_type= sContentType#+';base64',
                            #content_encoding = 'base_64'
                            #content_encoding = encoded_string
                            )
        return response

Раскомментирование строки #content_encoding = encoded_string дает мне ошибку:

 AssertionError: Header value b'/9j/4AAQSkZJRgABAQAA' is not a string in ('Content-Encoding', b'/9j/4AAQSkZJRgABAQAA....')

person Sheena    schedule 16.09.2013    source источник
comment
Почему бы не показывать изображения напрямую? Ресурсы в кодировке Base64 нужны только тогда, когда они встроены непосредственно в CSS или HTML. При обслуживании HTTP-ответа вы просто предоставляете ресурс в незакодированном виде.   -  person Martijn Pieters    schedule 16.09.2013
comment
@MartijnPieters: это природа зверя ... У меня есть один скрипт, который захватывает изображения и сохраняет их где-нибудь в хорошем месте, и у меня есть страница, на которой нужно их отображать. К сожалению, я не могу обслуживать их в обычном режиме из-за конфигурации, к которой у меня нет доступа. Также из-за характера приложения мне нужно иметь возможность извлекать некоторые из них динамически (я мог бы просто скрыть их где-нибудь на странице и показать их по мере необходимости, но их довольно много)   -  person Sheena    schedule 24.09.2013


Ответы (2)


FileResponse используется специально для загрузки файла в качестве ответа (отсюда и аргумент пути). В вашем случае вы хотите закодировать файл в base64 перед его загрузкой. Это означает, что нет FileResponse.

Поскольку вы прочитали файл в память, вы можете просто загрузить содержимое в файл Response.

response = Response(encoded_string,
                    request=request,
                    content_type=sContentType+';base64')

На самом деле я не уверен, как content_encoding сравнивается с ;base64 в типе, но я думаю, что кодировка чаще используется для содержимого, сжатого gzip. YMMV.

person Michael Merickel    schedule 16.09.2013

Ошибка, которую вы видите, говорит вам, что Content-Type не является строкой. Content-Type — это HTTP-заголовок. Насколько я знаю, заголовки HTTP должны быть строками.

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

person Tom Willis    schedule 16.09.2013