(WEB-INF と META-INF を除く) フォルダーのコンテンツのみがweb
URL を介してパブリックにアクセスできるため、アップロードされた画像はフォルダー内web
またはその子フォルダーに存在する必要があります。
画像を別のディレクトリに保存している場合は、メソッドを使用してファイル名を取得し、必要な処理を実行するなど、その URL にアクセスするたびに、を拡張HttpServlet
して URL にマップするクラスを作成する必要があります。検証 (ファイルの存在、許可など) を行ってから、ファイルを読み取り、の出力ストリームを介して提供します。/myapp/uploads/*
/myapp
/myapp/uploads/119.jpg
request.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