我知道有一些相关的问题,但没有一个涵盖我的主题。
所以,我有一个使用嵌入NetBeans(作为插件)的jsp,java,postgresl和apache tomcat 7.0.27.0的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' />
,图片应该正常显示。
任何人都能解释一下我做错了什么吗?提前谢谢。
答案 0 :(得分:2)
只有web
(WEB-INF和META-INF除外)文件夹的内容可以通过网址公开访问,因此您上传的图片必须位于web
或其中。
如果要将图像存储在另一个目录中,则必须创建一个扩展HttpServlet
的类并将其映射到URL,例如/myapp/uploads/*
(/myapp
是ContextPath )每当访问该URL时,例如/myapp/uploads/119.jpg
使用request.getPathInfo()
方法获取文件名并执行所需的验证(文件存在,permisions等),然后读取文件并通过{{1输出流。
或者,如果不需要权限验证,您可以将tomcats Default Servlet映射到HttpServletResponse
url模式。
图片代码的来源为/uploads/*
这是一个示例servlet:
<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
答案 1 :(得分:1)
您的问题不是jsp,而是图片的网址错误。
如果
没有显示图像< img src='../data/img/117.jpg' alt='title' />
这意味着要么你对图片的位置错误,要么有一些拦截器。也许图像是在文件系统中组织的,就像你写的那样,但这并不意味着url也是以这种方式组织的。检查web.xml是否存在用于图像的servlet映射或类似的东西。底线是如果平面img不工作不修复jsp :)首先你需要找到正确的图像网址,之后会很容易