java - jsp显示图片出错

标签 java jsp tomcat

我知道有一些相关的问题,但没有一个能涵盖我的主题。

所以,我有一个使用 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 Servlet Speciciation 3.0

关于java - jsp显示图片出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14573141/

相关文章:

java - Log4j 1.2.15 表达式过滤器正则表达式

java - onClick 中出现编译时错误 - 无法解析 "context"

java - 将实体映射到具有不同列的两个不同数据库上

java - 实现静态方法 - 需要帮助

svn - Mac OS - 从源代码构建 SVN,现在 Apache2 不加载站点

java - 嵌入 Tomcat : NoInitialContextException when trying to get a DataSource

jquery - 在 JSP 中向表单添加弹出窗口

java - 如果从 servlet 重定向,则在 JSP 上执行操作

java - 如何在 servlet 准备好服务后在 tomcat 中获取通知? (ServletContextListener 较早)

java - 尽管没有在 Tomcat 的 webapps 文件夹中放置任何数据,Eclipse 如何能够使用 Tomcat 显示 Java EE webapp?