0

関連する質問がいくつかあることは知っていますが、いずれも私の主題をカバーしていません。

したがって、NetBeans 内に (プラグインとして) 埋め込まれた jsp、java、postgresl、および apache tomcat 7.0.27.0 を使用する Web アプリケーションがあり、プロジェクトの Web ディレクトリに 116.jpg 画像があります。

この画像をそのように表示すると:< img src='116.jpg' alt='title' />

正常に表示されています。今、アップロードしたばかりの画像を表示したいのですが、それは次のように相対的なディレクトリに移動しました:1つのディレクトリ、次にフォルダ「data」、最後にフォルダ「img」。したがって、技術的に< img src='../data/img/117.jpg' alt='title' /> は、ただし、これは表示されていません。さらに...

自動でやりたい。ここ<%= sUploadFName %>には、ユーザーがアップロードしている画像の名前があります (例: 865.jpg )。

だから、私はうまくいくためにそのようなものが欲しいと思い < img src='../data/img"<%= sUploadFName %>"' alt='title' />ます.そして、画像は正常に表示されるはずです.

誰が私が間違っているのか説明できますか? 前もって感謝します。

4

2 に答える 2

1

(WEB-INF と META-INF を除く) フォルダーのコンテンツのみがwebURL を介してパブリックにアクセスできるため、アップロードされた画像はフォルダー内webまたはその子フォルダーに存在する必要があります。

画像を別のディレクトリに保存している場合は、メソッドを使用してファイル名を取得し、必要な処理を実行するなど、その URL にアクセスするたびに、を拡張HttpServletして URL にマップするクラスを作成する必要があります。検証 (ファイルの存在、許可など) を行ってから、ファイルを読み取り、の出力ストリームを介して提供します。/myapp/uploads/*/myapp/myapp/uploads/119.jpgrequest.getPathInfo()HttpServletResponse

または、権限の検証が必要ない場合は、 Tomcats Default ServletをURL パターンにマップすることもできます。/uploads/*

イメージタグのソースは次のようになります<img src="/myapp/uploads/119.jpg" alt="Image" />

サーブレットの例を次に示します。

package servlets;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;

public class StreamServlet extends HttpServlet {
    private static final String WINDOWS_UPLOAD_DIR = "C:\\Projects\\Data\\img";

    /**
     * Serve the images from the specified dir.
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
              throws ServletException, IOException {

        String fileName = req.getPathInfo().substring(1);
        File imageFile = new File(WINDOWS_UPLOAD_DIR, fileName);

        OutputStream os = resp.getOutputStream();
        InputStream is = new FileInputStream(imageFile);

        IOBridge(is, os);
        os.flush();
        Close(is, os);
    }

    /**
     * Bridge data between an input and output stream.
     *
     * @param in  The input stream.
     * @param out The output stream
     * @throws IOException if there's an error.
     */
     private static void IOBridge(InputStream in, OutputStream out) 
             throws IOException {

         byte data[] = new byte[1024];
         int readCount = 0;
         while ((readCount = in.read(data, 0, readCount)) != -1) {
             out.write(data);
         }
      }

     /**
      * Close some closeables
      *
      * @param closeables The closeables to be closed.
      */
     private static void Close(Closeable... closeables) {
          for (Closeable c : closeables)
              if (c != null)
                  try {
                      c.close();
                  } catch (IOException ioe) {
                      try {
                          c.close();
                      } catch (Exception e) {
                          e.printStackTrace();
                      }

                  } finally {
                        try { 
                             c.close();
                        } catch (Exception e) {
                             e.printStackTrace();
                        }
                 }
         }
    }  

次に、web.xmlに次を追加します。

<servlet>
    <servlet-name>StreamServlet</servlet-name>
    <servlet-class>servlets.StreamServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>StreamServlet</servlet-name>
    <url-pattern>/uploads/*</url-pattern>
</servlet-mapping>

Java サーブレット仕様 3.0

于 2013-01-28T23:37:51.203 に答える
0

あなたの問題は jsp にあるのではなく、画像の URL が間違っています。

画像が表示されない場合

< img src='../data/img/117.jpg' alt='title' />

これは、ページへの画像の場所が間違っているか、インターセプターがあることを意味します。おそらく、画像はあなたが書いたように編成されたファイルシステムにありますが、それはURLもこのように編成されているという意味ではありません. 画像のサーブレット マッピングなどがある場合は、web.xml をチェックインします。要するに、プレーン img が機能しない場合は jsp を修正しないでください:) まず、画像の正しい URL を見つける必要があり、その後は簡単になります

于 2013-01-28T23:37:43.303 に答える