http.server
を使用するシンプルなPythonサーバーがあります。目標は、ビデオをHTMLページに表示すること、またはビデオファイルをダウンロードすることではなく、ビデオをブラウザに直接表示することです。これは私が今までに持っているものです:レスポンスが完全にダウンロードされる前にブラウザが閉じるソケット
import http.server
class SuperHandler(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
path = self.path
encodedFilePath = 'file.mp4'
with open(encodedFilePath, 'rb') as videoFile:
self.send_response(200)
self.send_header('Content-type', 'video/mp4')
self.end_headers()
self.wfile.write(videoFile.read())
print('File sent: ' + videoFile.name)
server_address = ('', 8000)
handler_class = SuperHandler
httpd = http.server.HTTPServer(server_address, handler_class)
httpd.serve_forever()
私が持っている問題は、応答にフルビデオが含まれていないということです。 file.mp4
は50MBですが、ChromeやFirefoxのネットワークタブを見ると、応答は1MBしかないと言われています。フルファイルが転送されない理由はありますか?この作業を行うために何らかの種類のHTTPヘッダーを追加する必要がありますか?
EDIT:
これが今の私のコードです:
server_address = ('', 8000)
handler_class = http.server.SimpleHTTPRequestHandler
httpd = http.server.HTTPServer(server_address, handler_class)
httpd.serve_forever()
応答は今40メガバイト/ 30メガバイトである代わりのが(私は今デフォルトSimpleHTTPRequestHandlerのdo_GET
を使用していますが、それはまだ働いていません1MB)。
Chromeでfile.mp4
をリクエストすると、ソケット接続は〜7秒後に閉じられ(Firefoxでは約5秒後に)、BrokenPipeError: [Errno 32] Broken pipe
、because the server is still trying to write the rest of the video file on a closed socketにスローされます。
私の質問は、どうすればソケットを閉じる前にブラウザが完全な応答をダウンロードできるようにすることができますか?クライアントに送信され
追加情報
HTTPレスポンスヘッダ:
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.5.0
Date: Mon, 28 Dec 2015 02:36:39 GMT
Content-type: video/mp4
Content-Length: 53038876
Last-Modified: Fri, 25 Dec 2015 02:09:52 GMT
なぜhttp.serverを使用して静的ファイルを提供したいのですか? 'python3 -mhttp.server'を実行すると、ディレクトリ内のファイルを扱うことができます(クイックアンドダーティハックとして使用すると仮定します)。 – jfs
静的ファイルの提供は、私がやりたいことの一部にすぎないので、私はそれを自分でコーディングする必要があります。 – maximedupre
ここで 'http.server'を使うと決まったら' http.server.SimpleHTTPRequestHandler'がどのように実装されているかを見てください( 'copyfile()'はディスクからファイルを読み込み、それをユーザに送ります)。 – jfs