Java 在jsp中显示图像时出错
我知道有一些相关的问题,但没有一个涉及到我的主题 因此,我有一个web应用程序,使用jsp、java、postgresl和ApacheTomcat7.0.27.0嵌入到NetBeans中(作为插件),在项目的web目录中有一个116.jpg映像 当我这样显示这个图像时:Java 在jsp中显示图像时出错,java,jsp,tomcat,Java,Jsp,Tomcat,我知道有一些相关的问题,但没有一个涉及到我的主题 因此,我有一个web应用程序,使用jsp、java、postgresl和ApacheTomcat7.0.27.0嵌入到NetBeans中(作为插件),在项目的web目录中有一个116.jpg映像 当我这样显示这个图像时: 它正在正确显示。现在,我想显示一个我刚刚上传的图像,它进入了一个与之相关的目录:一个目录向上,然后是文件夹“data”,最后是文件夹“img”。因此,从技术上讲,但是,这并没有显示出来。而且 我想自动完成。在这里我有用户上传的图
![title](116.jpg)
它正在正确显示。现在,我想显示一个我刚刚上传的图像,它进入了一个与之相关的目录:一个目录向上,然后是文件夹“data”,最后是文件夹“img”。因此,从技术上讲,![title](../data/img/117.jpg)
但是,这并没有显示出来。而且
我想自动完成。在这里
我有用户上传的图像的名称(例如865.jpg)
所以,我想要这样的东西来工作:
![](../data/img)
图像应正常显示
谁能解释一下我做错了什么?提前感谢。您的问题不是jsp,而是图像的url错误 如果图像未显示为
< img src='../data/img/117.jpg' alt='title' />
这意味着要么你们对图片到页面的位置错了,要么是有拦截器。也许图像在文件系统中是按您所写的方式组织的,但这并不意味着url也是按这种方式组织的。检查web.xml中是否存在图像或类似内容的servlet映射。底线是如果plane img不起作用,请不要修复jsp:)首先,您需要找到图像的正确url,然后很容易找到只有
web
(web-INF和META-INF除外)文件夹的内容可以通过url公开访问,因此您上传的图像必须位于web
或其子文件夹中
如果要将图像存储在另一个目录中,则必须创建一个类来扩展HttpServlet,并将其映射到URL,例如/myapp/uploads/*
(/myapp
是上下文路径)每当访问该url时,例如/myapp/uploads/119.jpg
使用request.getPathInfo()
方法获取文件名并执行所需的验证(文件存在、权限等),然后读取该文件并通过HttpServletResponse
的输出流提供该文件
或者,如果不需要权限验证,您可以将Tomcat映射到/uploads/*
url模式
图像标签的来源是
下面是一个示例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>
StreamServlet
servlets.StreamServlet
StreamServlet
/上传/*
Triztian我可能懂java,但我对jsp不是很在行,而且我还有一个最后期限。也许另一个解决方案是将图像从另一个目录复制回其中(因为我现在无法更改存储图像的目录)。更简单吗?我错误地认为您正在使用tomcat,您正在使用它吗?是的,我正在使用嵌入式ApacheTomcat作为NetBeans插件Triztian我对此有两个问题。我编写了servlet并修改了web.xml。但是关于私有静态最终字符串LINUX_UPLOAD_DIR=“/var/www/myapp/uploads”;var之前的根目录/var假设它在这里是什么?我的计算机中有实际路径C:\Projects\Project\data\img,因此我试图在这里给出私有静态最终字符串LINUX\u UPLOAD\u DIR=“/Project/data/img”。我说得对吗;其次,这个LINUX\u UPLOAD\u DIR将成为我调用图像的根目录?例如,如果我在img文件夹中有123.jpg,我将img src=“/123.jpg”alt=“Image”/>并且我完成了?img标记的源代码将与答案中的源代码相同,正如您所看到的,我刚刚修改了常量,常量中的路径与
img
标记的url完全不同。