0

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

所以,我有一个使用 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' />并且图像应该正常显示。

谁能解释我做错了什么?提前致谢。

4

2 回答 2

1

只有web(WEB-INF 和 META-INF 除外)文件夹的内容可以通过 url 公开访问,因此您上传的图像必须位于web其中或其子文件夹中。

如果您将图像存储在另一个目录中,那么您将必须创建一个扩展的类HttpServlet并将其映射到一个 URL,例如/myapp/uploads/*/myapp是 ContextPath)每当访问该 url 时,例如/myapp/uploads/119.jpg使用方法获取文件名request.getPathInfo()并执行所需的验证(文件存在、权限等),然后读取文件并通过HttpServletResponse的输出流提供它。

或者,如果不需要权限验证,您可以将 tomcats Default Servlet映射到url 模式。/uploads/*

您的图像标签的来源是<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 规范 3.0

于 2013-01-28T23:37:51.203 回答
0

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

如果没有显示图像

< img src='../data/img/117.jpg' alt='title' />

这意味着您对图片到页面的位置有误,或者有一些拦截器。也许图像像您写的那样在文件系统中组织,但这并不意味着 url 也以这种方式组织。如果有图像的 servlet 映射或类似的东西,请检查 web.xml。底线是,如果平面 img 不起作用,请不要修复 jsp :) 首先,您需要找到正确的图像 url,之后它会很容易

于 2013-01-28T23:37:43.303 回答