【问题标题】:How can I display image file object from java to jsp?如何将图像文件对象从 java 显示到 jsp?
【发布时间】:2014-12-03 03:46:58
【问题描述】:

我有一个返回图像文件对象的方法:

public File getPhoto(entryId){...}

我从我的操作方法中调用此方法并将文件设置为 DTO 文件变量:

    myDto.photo = getPhoto(entryId); 
       // where entryId refers to the name of the image file 
       // e.g. ent01 for ent01.gif, ent02 for ent02.gif and so on.

现在,在我的 JSP 文件中,我想通过如下代码显示图像:

<img src = "${myDto.photo}"> 

但是,我意识到 myDto.photo 是一个文件对象,因此具有文件的绝对路径,而不是 JSP 中 img src 所需的 URL。

通过搜索,我了解到我可以使用 servlet 并使用类似

<img src = "${pageContext.request.contextPath}/image/ent01.gif"}. 

但是,我对这个有点困惑,因为我希望文件名部分 (ent01.gif) 根据输入 entryId 有所不同。

我希望任何人都可以为我阐明这一点。非常感谢。

【问题讨论】:

  • 你了解春天吗?如果是,那么我可以举个简单的例子
  • 我没有看到您的代码示例,您是否包含了它们?
  • 修复了代码示例。对此感到抱歉。

标签: java html image jsp servlets


【解决方案1】:

您可以创建一个控制器类来显示您想要的图像。

@Controller
public class ImageReadFile{

    // this is for mapping your image related path. 
    @RequestMapping(value="/image/*")
    public void readImage(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        ServletContext sc = request.getServletContext();

        //here i uploaded my image in this path
        // You can set any path here
        String imagePath = "/home/somefolder/Workspaces/Images/";
        String [] fragmentFilename = request.getServletPath().split("/");

        //Check if image isn't set
        if(fragmentFilename.length <= 2){
            return;
        }

        String filename = fragmentFilename[2];
        String requestedImage = "/"+filename;

        if(filename == null){
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

        File image = new File(imagePath, URLDecoder.decode(requestedImage, "UTF-8"));

        if(!image.exists()){
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

        String contentType = sc.getMimeType(image.getName());
        response.reset();
        response.setContentType(contentType);
        response.setHeader("Content-Length", String.valueOf(image.length()));
        Files.copy(image.toPath(), response.getOutputStream());
    }

}

Servlet 版本。

试试这个。

@WebServlet("/image/*")
public class ImageWriter extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        ServletContext sc = request.getServletContext();

        //here i uploaded my image in this path
        // You can set any path here
        String imagePath = "/home/somefolder/Workspaces/Images/";
        String [] fragmentFilename = request.getServletPath().split("/");

        //Check if image isn't set
        if(fragmentFilename.length <= 2){
            return;
        }

        String filename = fragmentFilename[2];
        String requestedImage = "/"+filename;

        if(filename == null){
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

        File image = new File(imagePath, URLDecoder.decode(requestedImage, "UTF-8"));

        if(!image.exists()){
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

        String contentType = sc.getMimeType(image.getName());
        response.reset();
        response.setContentType(contentType);
        response.setHeader("Content-Length", String.valueOf(image.length()));
        Files.copy(image.toPath(), response.getOutputStream());

    }

}

这就是你在jsp中设置显示的方式,

<img alt="${imageFilename}" src="${pageContext.request.contextPath}/image/${imageFilename}">

只需将文件名传递给jsp,然后让控制器读取并显示它。

希望这会对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 2022-07-27
    • 1970-01-01
    • 2012-04-21
    • 2020-06-19
    • 2013-08-15
    相关资源
    最近更新 更多