5

BaseHTTPServer を使用して Web コンテンツを提供しています。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

クライアント側でマークアップすると、画像コンテンツがレンダリングされないようです。壊れた画像として表示されます。

何か案は?

4

3 に答える 3

9

バイナリ モードではなく、テキスト モードでファイルを開いています。改行文字は混乱する可能性があります。代わりにこれを使用してください:

f = open(curdir + sep + self.path, 'rb')
于 2011-03-13T04:34:50.453 に答える
3

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 を参照してください。

于 2012-04-06T05:21:50.503 に答える
1

いつでもファイルをバイナリとして開くことができます;-)

おそらく、コードのこの部分で SimpleHTTPServer.py を見ることができます:

    ctype = self.guess_type(パス)
    試す:
        # 常にバイナリ モードで読み取ります。ファイルをテキスト モードで開くと、
        # 改行翻訳、コンテンツの実際のサイズを作成
        # content-length 未満で送信されました!
        f = オープン (パス、「rb」)
    IOError を除く:
        self.send_error(404、「ファイルが見つかりません」)
        返却なし

次に、defguess_type(self, path)を見ると、非常に単純で、ファイル「拡張子」を使用します;-)

    戻り値は、タイプ/サブタイプの形式の文字列です。
    MIME Con​​tent-type ヘッダーに使用できます。

    デフォルトの実装は、ファイルの拡張子に見えます
    application/octet-stream を使用して、表 self.extensions_map にアップします。
    デフォルトとして; ただし、許容されます(
    遅い)より良い推測をするためにデータの内部を調べます。

念のため、コードは次のとおりです。

    base, ext = posixpath.splitext(パス)
    self.extensions_map の ext の場合:
        return self.extensions_map[ext]
    ext = ext.lower()
    self.extensions_map の ext の場合:
        return self.extensions_map[ext]
    そうしないと:
        self.extensions_map[''] を返す

于 2011-11-16T17:07:37.263 に答える