我知道有一些相关的问题,但没有一个能涵盖我的主题。
所以,我有一个使用 jsp、java、postgresl 和 apache tomcat 7.0.27.0 嵌入在 NetBeans 中的 Web 应用程序(作为插件),在项目的 Web 目录中我有一个 116.jpg 图像
当我像这样显示此图像时:< img src='116.jpg' alt='title' />
显示正确。现在,我想显示一张我刚刚上传的图片,它转到了一个与该图片相关的目录:向上一个目录,然后是文件夹“data”,最后是文件夹“img”。所以,从技术上讲,< img src='../data/img/117.jpg' alt='title' />
然而,这并没有被显示。而且……
我想自动完成。在这里<%= sUploadFName %>
我有用户上传的图片的名称(例如 865.jpg )。
所以,我想要这样的东西才能工作:
< img src='../data/img"<%= sUploadFName %>"' alt='title' />
并且图像应该正常显示。
谁能解释我做错了什么?提前致谢。
最佳答案
只有web
的内容(WEB-INF 和 META-INF 除外)文件夹可通过 url 公开访问,因此您上传的图像必须位于 web
中或它的 child 。
如果您将图像存储在另一个目录中,那么您必须创建一个类来扩展 HttpServlet
并将其映射到一个 URL,比如 /myapp/uploads/*
(/myapp
是 ContextPath)每当访问该网址时,例如 /myapp/uploads/119.jpg
使用 request.getPathInfo()
获取文件名方法并执行所需的验证(文件存在、权限等),然后读取文件并通过 HttpServletResponse
提供服务的输出流。
或者你可以映射 tomcats Default Servlet到 /uploads/*
如果不需要权限验证,则为 url 模式。
您的图片标签的来源是 <img src="/myapp/uploads/119.jpg" alt="Image" />
这是一个示例 servlet:
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 - jsp显示图片出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14573141/