2014-12-03 86 views
0

我有它返回的图像的文件对象的方法:如何将图像文件对象从java显示到jsp?

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。

我希望任何人都可以在这一个上为我散光。非常感谢。

+0

你有关于春天的知识?如果是,那么我可以举个简单的例子 – Secondo 2014-12-03 03:50:45

+0

我没有看到你的代码示例,你包括它们吗? – Revent 2014-12-03 03:53:49

+0

修复了代码示例。对于那个很抱歉。 – jaysn 2014-12-03 04:14:15

回答

0

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

@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然后让控制器读取并显示出来。

希望这会帮助你。