Java 在jsp中显示图像时出错

Java 在jsp中显示图像时出错,java,jsp,tomcat,Java,Jsp,Tomcat,我知道有一些相关的问题,但没有一个涉及到我的主题 因此,我有一个web应用程序,使用jsp、java、postgresl和ApacheTomcat7.0.27.0嵌入到NetBeans中(作为插件),在项目的web目录中有一个116.jpg映像 当我这样显示这个图像时: 它正在正确显示。现在,我想显示一个我刚刚上传的图像,它进入了一个与之相关的目录:一个目录向上,然后是文件夹“data”,最后是文件夹“img”。因此,从技术上讲,但是,这并没有显示出来。而且 我想自动完成。在这里我有用户上传的图

我知道有一些相关的问题,但没有一个涉及到我的主题

因此,我有一个web应用程序,使用jsp、java、postgresl和ApacheTomcat7.0.27.0嵌入到NetBeans中(作为插件),在项目的web目录中有一个116.jpg映像

当我这样显示这个图像时:
title

它正在正确显示。现在,我想显示一个我刚刚上传的图像,它进入了一个与之相关的目录:一个目录向上,然后是文件夹“data”,最后是文件夹“img”。因此,从技术上讲,
title
但是,这并没有显示出来。而且

我想自动完成。在这里
我有用户上传的图像的名称(例如865.jpg)

所以,我想要这样的东西来工作:
图像应正常显示


谁能解释一下我做错了什么?提前感谢。

您的问题不是jsp,而是图像的url错误

如果图像未显示为

< img src='../data/img/117.jpg' alt='title' />
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完全不同。