如何使用Jersey WS从服务器中的文件夹中获取图像?

时间:2013-12-27 16:54:17

标签: java web-services web jersey

我正在学习Jersey网络服务,现在我明白了GET和POST是如何工作的:

 @GET
    @Produces("text/html")
    public String getHandler() {
        return "<h1>Get some REST!<h1>";
    }

@POST
@Consumes("application/x-www-form-urlencoded")
@Produces("text/plain")
public String postHandler(String content) {
    return content;
} 

在泽西岛文档中提供了令人惊叹的图像:

@GET
@Path("/images/{image}")
@Produces("image/*")
public Response getImage(@PathParam("image") String image) {
  if (!isSafeToOpenFile(image)) {
    throw new IllegalArgumentException("Cannot open the image file.");
  }

  File f = new File(image);

  if (!f.exists()) {
    throw new WebApplicationException(404);
  }

  String mt = new MimetypesFileTypeMap().getContentType(f);
  return Response.ok(f, mt).build();
}

如果您能使用上述代码从服务器中的文件夹中获取图像并将其发布到html中,我将非常感激。 非常感谢。

2 个答案:

答案 0 :(得分:1)

来自文档的Jersey示例对我来说足够清楚了。但是,这是一个没有参数的简化示例(开始时很简单......)

@GET
@Path("/images/pet")
@Produces("image/*")
public Response getImage() {
  File f = new File("C:\\\\Temp\\dog.jpg");
  if (!f.exists()) {
    throw new WebApplicationException(404);
  }
  String mt = new MimetypesFileTypeMap().getContentType(f);
  return Response.ok(f, mt).build();
}

由于我的Jersey在 yourapp 应用程序的 web.xml 中配置为/rest/*路径,因此可以通过以下地址访问该图像:

http://serverip:port/yourapp/rest/images/pet

您可以直接在浏览器导航栏中尝试此URL(它是一个REST图像服务,就像它是静态图像一样),或者如果您想在html页面中使用它,您可以使用经典HTML:< / p>

<html>
  <body>
    <h1>Woof!</h1>
    <img src="http://localhost:8080/myapp/rest/images/pet" />
  </body>
</html>

希望它有所帮助。

修改

好的,这太明显了。因此,您需要实现一个方法或服务,该方法或服务以您需要的给定顺序(作为Java列表)为目录的内容提供图像文件名。

使用此List,您可以在循环中构建这样的html:

<html>
  <body>
    <h1>Several images</h1>
    <img src="/yourapp/rest/images/last.jpg" /><br/>
    <img src="/yourapp/rest/images/third.jpg" /><br/>
    <img src="/yourapp/rest/images/second.jpg" /><br/>
    <img src="/yourapp/rest/images/first.jpg" /><br/>
  </body>
</html>

这是您必须输出的结果HTML(在JSP或您使用的任何内容中)。 REST服务getImage()将由浏览器自动调用,每个图像一次。

我清楚了吗?

答案 1 :(得分:1)

以下是基于REST服务的实时图库的完整示例。

REST服务(泽西岛)

此服务提供图像服务器目录的内容(文件名)(此处为C:\Temp\hotfolder)。

    // array of supported extensions 
    static final String[] EXTENSIONS = new String[] { "jpg", "jpeg", "gif", "png", "bmp" };

    // filter to identify images based on their extensions
    static final FilenameFilter IMAGE_FILTER = new FilenameFilter() {

        @Override
        public boolean accept(final File dir, final String name) {
            for (final String ext : EXTENSIONS) {
                if (name.endsWith("." + ext)) {
                    return (true);
                }
            }
            return (false);
        }
    };

    @GET
    @Path("folderImages")
    @Produces("text/json")
    public Response getFolderImages(@QueryParam("lastknown") String lastknown) 
    {
        //Gets the contents of the folder (reverse order : more recent first)
        //see http://stackoverflow.com/questions/11300847/load-and-display-all-the-images-from-a-folder
        File dir = new File("C:\\Temp\\hotfolder");
        File [] files = dir.listFiles(IMAGE_FILTER); 
        Arrays.sort( files, new Comparator<File>() {
            public int compare(File f1, File f2) {
                if (f1.lastModified() > f2.lastModified()) {
                    return -1;
                } else if (f1.lastModified() < f2.lastModified()) {
                    return +1;
                } else {
                    return 0;
                }
            }
        });
        //Fills a list (from the more recent one, until the last known file)
        ArrayList<String> newfiles = new ArrayList<String>();
        for (File f : files)
        {
            if (lastknown!=null && f.getName().equals(lastknown)) 
                break;
            newfiles.add(f.getName());
        }
        //Answers the list as a JSON array (using google-gson, but could be done manually here)
        return Response.status(Status.OK).entity(new Gson().toJson(newfiles)).type("text/json").build();
    }

这也是单独渲染每个图像所需的图像服务。

    @GET
    @Path("/images/{image}")
    @Produces("image/*")
    public Response getImage(@PathParam("image") String image) {
      File f = new File("C:\\Temp\\hotfolder\\" + image);
      if (!f.exists()) {
        throw new WebApplicationException(404);
      }
      String mt = new MimetypesFileTypeMap().getContentType(f);
      return Response.ok(f, mt).build();
    }

<强> gallery.html

Html,在JQuery的帮助下。此HTML每5秒轮询一次,如果有新文件(比最近的文件更新),则要求服务。 Etvoilà!

您可以注意到我们正在使用jquery .prepend方法在图库div的开头动态插入图片。

<html>
<head>
  <title>Folder demo</title>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
</head>
<body>
    <h1>Live gallery</h1>
    <div id="gallery1" style="border:1px solid black;padding:10px;"></div>
    <div id="info1"></div>
<script>
var counter = 0; 
var lastknown = ""; 
function doPoll(){
$.get('rest/folderImages?lastknown='+lastknown, function(data) {
    counter++;
    $("#info1").html("<pre>Counter: " + counter + "<br>New files: " + data + "</pre>");
    for (var i=data.length-1; i>=0; i--) {
        $("#gallery1").prepend("<img src=\"rest/images/" + data[i] + "\" style=\"width:200px;height:200px\" />");
        lastknown = data[i];
    }
    setTimeout(doPoll,5000);
    });
}
$(document).ready( doPoll );
</script>
</body>
</html>