0

イメージ サーブレットに奇妙な状況があります。Eclipse の内部 Web ブラウザでは問題なく動作しますが、FireFox、InternetExplorer、Chrome、Opera では動作しません....

サーブレット コード (以下)

protected void doPost(HttpServletRequest リクエスト、HttpServletResponse レスポンス) throws ServletException、IOException {

  File fl=new File("C:\\Documents and Settings\\Administrator\\My Documents\\Eclipse\\zadatak\\WebContent\\WEB-INF\\upload\\");
  PrintWriter pw=response.getWriter();
  response.setContentType("text/html");

  pw.println("<html>");
  pw.println("<head>");
  pw.println("<style type=\"text/css\">");
  pw.println("img{display:block-inline;width:100px;height:100px;");
  pw.println("</style>");
  pw.println("</head>");
  pw.println("<body>");
  pw.println("<table border=\"1\">");
  pw.println("<tr>");

  for(File f:fl.listFiles()){ 
      pw.println("<td>");
      pw.println("<img src=\"" + f.getPath() + "\">");
      pw.println("</td>");
  }   

  pw.println("</tr>");
  pw.println("</table>");
  pw.println("</body>");
  pw.println("</html>");

}

Eclipse の内部 Web ブラウザーでは、次のようになります (以下)。

Eclipse 内部 Web ブラウザーの PrintScreen

最後に、私の問題の解決策を見つけました。助けてくれてありがとう!

これで、このコードが機能します。

  ServletContext context=request.getServletContext();
  String path=context.getRealPath("upload");

  File fl=new File(path);
  PrintWriter pw=response.getWriter();
  response.setContentType("text/html");

  pw.println("<html>");
  pw.println("<head>");
  pw.println("<style type=\"text/css\">");
  pw.println("img{display:block-inline;width:100px;height:100px;");
  pw.println("</style>");
  pw.println("</head>");
  pw.println("<body>");
  pw.println("<table border=\"1\">");
  pw.println("<tr>");

  LinkedHashMap<Integer, String> hm=new LinkedHashMap<Integer,String>();
  int imageIndex=-1;
  for(File f:fl.listFiles()) {        
      if(f.getName()!=null){
          if(f.getName().endsWith(".bmp"))
              hm.put(++imageIndex, f.getName());
      }               
  }

  Iterator<String> pic=hm.values().iterator();

  while(pic.hasNext()){
      pw.println("<img src=\"upload/" + pic.next() + "\"/>");
  }


  pw.println("</tr>");
  pw.println("</table>");
  pw.println("</body>");
  pw.println("</html>");

私のプロジェクトのクラス階層は次のようになります

MyWebProject
 |-- src
 |    :
 |
 |-- web
 |    |-- META-INF
 |    |    `-- MANIFEST.MF
 |    |-- WEB-INF
 |    |    `-- web.xml
 |-- upload (the place where I keep pictures)
 :    

Firefox で写真を正しく表示できるようになりました

Firefox はページを正しく表示します

4

1 に答える 1

3

あなたが何をしているのか考えてみてください。ディスクにイメージがあるサーバーがあります。また、サーバーから何十マイルも離れた別のマシンで実行されるブラウザもあります。

サーブレットは以下をブラウザに送信します。

<img src="C:\Documents and Settings\Administrator\My Documents\Eclipse\zadatak\WebContent\WEB-INF\upload\someIage.jpg"/>

これは次の場合にのみ機能します。

  • HTMLページはHTTPでロードされますが、ブラウザはファイルシステムから画像をロードすることを受け入れます
  • URL が正しくありませんが、ブラウザーはファイル システムからファイルをロードすることを受け入れます (それは である必要がありますfile://...) 。
  • クライアントは Windows 上で実行されます
  • ユーザーはたまたまC:\Documents and Settings\Administrator\My Documents\Eclipse\zadatak\WebContent\WEB-INF\upload\自分のマシンに名前の付いたフォルダーを持っています
  • このフォルダーには、サーブレットが送信するすべての画像が既に含まれています

これはおそらくうまくいかないことを理解する必要があります。

必要なのは、サーバー上のファイルから画像をロードし、このファイルのコンテンツを HTTP サーブレット応答に送信するサーブレットです (正しいコンテンツ タイプを設定することを忘れないでください)。

このようなサーブレットを作成したら (URL にマップされ/image、イメージの ID をパラメーターとして受け取ると仮定します)、既に作成されているサーブレットは次のコードを生成する必要があります。

for (String id: idsOfTheImageToDisplay){ 
  pw.println("<td>");
  pw.println("<img src=\"/image?" + id + "\"/>");
  pw.println("</td>");

}

また、BMP は圧縮されていないため、多くの帯域幅を消費するため、Web には適していません。たとえば、画像を JPEG ファイルに変換する必要があります。

于 2013-08-12T14:46:15.000 に答える