Как я могу обслуживать типы содержимого изображения с помощью метода do_GET Python BaseHTTPServerRequestHandler?

Я использую BaseHTTPServer для обслуживания веб-контента. Я могу обслуживать Content-types 'text / html' или 'text / css' или даже 'text / js', и это отображается на стороне браузера. Но когда я пытаюсь

self.send_header('Content-type', 'image/png')

для файла .png он вообще не отображается.

Вот образец:

                    if self.path.endswith(".js"):
                            f = open(curdir + sep + self.path)
                            self.send_response(200)
                            self.send_header('Content-type',        'text/javascript')
                            self.end_headers()
                            self.wfile.write(f.read())
                            f.close()
                            return

это отлично работает для javascript

                    if self.path.endswith(".png"):
                            f=open(curdir + sep + self.path)
                            self.send_response(200)
                            self.send_header('Content-type',        'image/png')
                            self.end_headers()
                            self.wfile.write(f.read())
                            f.close()
                            return

похоже, это не отображает содержимое изображения, когда я размечу его для клиентской стороны. Это выглядит как сломанное изображение.

Любые идеи?


person Brandon Runyon    schedule 13.03.2011    source источник


Ответы (3)


Вы открыли файл в текстовом режиме, а не в двоичном. Любые символы новой строки могут испортиться. Используйте вместо этого:

f = open(curdir + sep + self.path, 'rb')
person Liquid_Fire    schedule 13.03.2011
comment
В этом есть смысл. Мне даже в голову не пришло, в каком режиме. Именно так, спасибо! - person Brandon Runyon; 13.03.2011

Попробуйте использовать SimpleHTTPServer

class MyHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    """modify Content-type """
    def guess_type(self, path):
        mimetype = SimpleHTTPServer.SimpleHTTPRequestHandler.guess_type(
            self, path
            )
        if mimetype == 'application/octet-stream':
            if path.endswith('manifest'):
                mimetype = 'text/cache-manifest'
        return mimetype

см. /usr/lib/python2.7/SimpleHTTPServer.py для получения дополнительной информации.

person alswl    schedule 06.04.2012

вы всегда можете открыть файл как двоичный ;-)

Возможно, вы могли бы посмотреть SimpleHTTPServer.py в этой части кода:

    ctype = self.guess_type(path)
    try:
        # Always read in binary mode. Opening files in text mode may cause
        # newline translations, making the actual size of the content
        # transmitted *less* than the content-length!
        f = open(path, 'rb')
    except IOError:
        self.send_error(404, "File not found")
        return None

Затем, если вы посмотрите на def guess_type (self, path): он очень простой, он использует файл «extension» ;-)


    Return value is a string of the form type/subtype,
    usable for a MIME Content-type header.

    The default implementation looks the file's extension
    up in the table self.extensions_map, using application/octet-stream
    as a default; however it would be permissible (if
    slow) to look inside the data to make a better guess.

На всякий случай код такой:


    base, ext = posixpath.splitext(path)
    if ext in self.extensions_map:
        return self.extensions_map[ext]
    ext = ext.lower()
    if ext in self.extensions_map:
        return self.extensions_map[ext]
    else:
        return self.extensions_map['']

person demontux    schedule 16.11.2011
comment
Ваша подсветка синтаксиса, похоже, сломалась - person Allison; 06.06.2013