質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • Python 3.x

    6342questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

サーバー内の画像をHTMLで表示するにはどうすればいいでしょうか

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,379

mmss

score 32

質問失礼いたします。

サーバー内にある画像をHTMLで表示したく、以下のようなプログラムを作成したのですが、上手くいかず困っております。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import cgi
import cgitb
import os, sys
cgitb.enable()

f = open("hosi.jpg","rb")

# print("Content-Type: text/html")
print("Content-Type: image/jpeg")
print("")
print("<html><body>")
print(f.read())
print("</body><html>")


画像を表示したいので"Content-type"を"image/jpeg"にすべきだとは思ったのですが、そのようにすると画面が真っ黒になってしまいます。また、"Content-type"を"text/html"にすると、画像は表示されず英数字が長々と表示されます。

ご助力いただけますと幸いでございます。
何卒よろしくお願いいたします。


割愛させていただいていた部分のCODEも表示させていただきました。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import cgi
import cgitb
import os, sys
cgitb.enable()

try:
  import msvcrt
  msvcrt.setmode(0, os.O_BINARY)
  msvcrt.setmode(1, os.O_BINARY)
except ImportError:
  pass

result = 'DUMMY'
form = cgi.FieldStorage()
#if form.has_key('file'):
if 'file' in form:
  item = form['file']
  if item.file:
#    fout = file(os.path.join('/tmp', item.filename), 'wb')
    fout = open(os.path.join('C:\server\cgi-bin\write', item.filename), 'wb')
    while True:
        chunk = item.file.read(1000000)
        if not chunk:
          break

        fout.write(chunk)
        fout.close()
        result = 'upload is done'
        #result = "アップロード"

f = open("hosi.jpg","rb")
print("Content-Type: text/html")
# print("Content-Type: image/jpeg")
print("")
print("<html><body>")
print(f.read())
print(result)
print("</body><html>")
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • scsi

    2017/10/02 20:42

    質問の表題からだと pythonを使わず、htmlで <html><body><img src='./hosi.jpg'></body><html> を書けばいいだけのような気がしますが、、、

    キャンセル

  • mmss

    2017/10/02 20:48 編集

    ご助力いただき、大変ありがとうございます。 説明不足で恐縮ですが、実はブラウザからアップロードされた画像をサーバーに保存し、且つブラウザに表示するようなプログラムを作成したく考えております。 ※わかりにくくなると思い、サーバーに保存するCODEの部分は割愛しております

    キャンセル

回答 1

checkベストアンサー

0

HTMLで表示されたいのでしたら、<img>要素を使ってパスだけ送ればいいのではないでしょうか?

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import cgi
import cgitb
import os, sys
cgitb.enable()

print("Content-Type: text/html")
print("")
print("<html><body>")
print("<img src='./hosi.jpg'>")
# ↑ 画像のパスは適切なものに変更してください。絶対パスの方が簡単かも。。
print("</body><html>")

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/02 20:42

    ご助力いただき、大変ありがとうございます。

    print("<img src='./hosi.jpg'>")で試してみたところ、以下のエラーが出てしまいました。
    OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。

    一方でprint("<img src='./hosi.jpg'>")のまま、Content-typeをimage/jpegに変えたところエラーが出なくなった代わりに、画面が真っ暗になってしまいました。
    ※コマンドプロンプトには以下のように表示されています。
    127.0.0.1 - - [02/Oct/2017 20:35:03] "POST /cgi-bin/open_image.py HTTP/1.1" 200 -
    127.0.0.1 - - [02/Oct/2017 20:35:03] command: C:\Anaconda3\python.exe -u C:\server\cgi-bin\open_image.py ""
    127.0.0.1 - - [02/Oct/2017 20:35:04] CGI script exited OK

    <img>で表示するやり方のほうがスマートですのでぜひ利用したいのですが、content-typeがimageではなくても表示できるものなのでしょうか。。

    キャンセル

  • 2017/10/02 22:12 編集

    う〜ん、、おそらく掲示いただいた場所以外でエラーが生じているように思われます。(`import os`していますけど`os`、質問コード中にはありませんよね?...まぁ、もしかしたら`os`が原因ではないかもしれません...その時はすみません。。)
    とりあえず`print("<img src='./hosi.jpg'>")`が原因ではないです。`OSError`ですからね。

    content-typeはもう`text/html `から変えないでください。確かに`text/html`が原因には関わっていると考えられますが、ここではなく、根本の問題を解決するべきです。

    こっちでも少し調べてみます。できれば「関係ない」としたコードの部分(特に`os`を使った部分)も明かせる範囲で明かしていただけるとありがたいです。m(_ _)m

    キャンセル

  • 2017/10/02 22:26

    ご返信いただきありがとうございます。
    質問を編集させていただき、全CODEを表示させていただきました。

    またお時間いただき、大変恐縮です。ご教授いただいた内容のもと、自分でも色々頑張ってみたいと思います!!

    キャンセル

  • 2017/10/02 23:17 編集

    勘、という程度なんですけど、、`C:\Anaconda3\python.exe -u C:\server\cgi-bin\open_image.py ""`が原因のような気がします。(的外れでしたらすみません。)

    windowsはファイル名に空白があると`OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。`を吐き出すそうですから、
    おそらく`〜\open_image.py`と` ""`が一つのファイル名だと見なされてこんな現象がおきてしまっているような。。

    なんで`image/jpeg`だとうまくいくかは不明ですけどね。。(^ ^;

    当方はMacなのでどう直せばいいかははっきりは言えないです(試せないので)。すみません。。

    キャンセル

  • 2017/10/03 10:32

    ご助力いただきありがとうございます。

    空白問題は大丈夫だと思っていましたが、まさかそこに空白があるとは。。
    どうしてそこに空白があるのか調べて、直してみたいと思います。

    キャンセル

  • 2017/10/03 12:19

    色々試してみたり聞いてみたりしたのですが、print('<img>')のCODEを以下のように書き直したところ上手くいきました!!
    print('<img src="http://localhost:8000/hosi.jpg" />')

    とはいえnamnium1125さんのご助力大変ありがたかったです><
    どうぞ、また機会がございましたらご助力いただけますと幸いでございます。

    本当にありがとうございました!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    6342questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。