2017-03-06 1 views
0

URLから画像をダウンロードするコードを作成してから、その画像をbase64にエンコードします。コードの関連部分である:リクエストで画像を取得してbase64でエンコードするが、ヘッダーが正しくない

dlimage = requests.request("GET", imageURL) 
encodedImage = ("data:" + dlimage.headers['Content-Type'] + ";" + "base64," + base64.encodestring(dlimage.content)) 

結果の出力は次のとおり

data:text/html;base64,PGh0bWw+DQo8aGVhZD48dGl0bGU+NDAzIEZvcmJpZGRlbjwvdGl0bGU+PC9oZWFkPg0KPGJvZHkgYmdjb2xvcj0id2hpdGUiPg0KPGNlbnRlcj48aDE+NDAzIEZvcmJpZGRlbjwvaDE+PC9jZW50ZXI+DQo8aHI+PGNlbnRlcj5uZ2lueDwvY2VudGVyPg0KPC9ib2R5Pg0KPC9odG1sPg0K 

当該画像がJPEGあります。では、なぜヘッダはtext/htmlと言っていますか?私は別のツールを使ってイメージを変換しました。文字列はまったく異なります。

+0

これの値は何ですか?そのヘッダーの値が "text/html"であるように見えます。その配列にアクセスしてヘッダーを取得するのではなく、常にイメージになるため、必要なものだけをハードコードする必要はありません。したがって、dlimage.headers ['Content-Type']の代わりに「image/jpeg」が必要です。 – victor

+0

ダウンロードされたイメージがPNGまたはGIFになることがあるため、image/jpegをハードコードできません。 –

+0

そのヘッダーに何か問題があります。サーバーが正しく設定していません。サーバー側のコードにアクセスできますか? – victor

答えて

0

ファイルはではなく、のJPEGファイルです。

JPEG fileは、バイト0xFF、0xD8、0xFFで始まります。 /9j/(Pythonの3.6とIPythonの例)となっbase64エンコーディングで:

In [1]: start = b'\xff\xd8\xff' 

In [2]: base64.b64encode(start).decode('ascii') 
Out[2]: '/9j/' 

あなたのbase64でエンコードされた文字列が異なる始まるので、それはJPEGファイルではありません。コンテンツのデコード

:dlimage.headers [ 'Content-Typeの']:

In [3]: base64.b64decode('PGh0bWw+DQo8aGVhZD48dGl0bGU+NDAzIEZvcmJpZGRlbjwvdGl0bGU+PC9oZWFkPg0KPGJvZHkgYm 
    ...: djb2xvcj0id2hpdGUiPg0KPGNlbnRlcj48aDE+NDAzIEZvcmJpZGRlbjwvaDE+PC9jZW50ZXI+DQo8aHI+PGNlbnRlcj5uZ2 
    ...: lueDwvY2VudGVyPg0KPC9ib2R5Pg0KPC9odG1sPg0K') 
Out[3]: b'<html>\r\n<head><title>403 Forbidden</title></head>\r\n<body bgcolor="white">\r\n<center><h1>403 Forbidden</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n' 

あなたは、画像へのアクセスを持っていない...

関連する問題