Как прочитать файл, используя пути относительно корня контекста в Джерси? - PullRequest
0 голосов
/ 02 апреля 2012

Я изучаю REST, используя Джерси.Мне удалось создать приложение клише Hello World.Теперь (только для учебных целей) я пытаюсь вернуть файл изображения через поток байтов.Тем не менее, я получаю IOException, что файл не может быть прочитан.Ниже приведен мой класс ресурсов:

@Path("/image/{file}")
public class ImageResource
{
   @Context
   private UriInfo uri;

   @GET
   @Produces("image/jpg")
   public Response getFullImage(@PathParam("file") String fileName)
   {
      Response response = null;
      String contextRoot = getUri().getBaseUri().toString();

      try
      {
         BufferedImage image = ImageIO.read(new File(contextRoot + "/images/" + fileName));
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         ImageIO.write(image, "jpg", baos);
         byte[] imgBytes = baos.toByteArray();

         response = Response.ok(new ByteArrayInputStream(imgBytes)).build();
      }
      catch (IOException e)
      {
         System.err.println("Error reading image file..." + e.getMessage());
         e.printStackTrace();
      }

      return response;
   }

   private UriInfo getUri() {
      return uri;
   }

}

Изображение хранится в WebContent/images/image001.jpg, и я использую URL: http://localhost:8080/REST/image/image001.jpg для обращения к ресурсу.

Может кто-нибудь сообщить мне, пожалуйстапричина исключения ???

Ответы [ 2 ]

0 голосов
/ 16 марта 2013

Вы должны получить доступ к изображению в виде URL. Для меня это сработало:

String path=uriInfo.getBaseUri().toString();
            path=path.substring(0, path.lastIndexOf("/rest"))+"/img/"+foto;
            try {
                URL pathUrl=new URL(path);
                BufferedImage image=ImageIO.read(pathUrl);
                ByteArrayOutputStream baos=new ByteArrayOutputStream();
                ImageIO.write(image, "jpg", baos);
                byte[] imgBytes=baos.toByteArray();
                 return  Response.ok(new ByteArrayInputStream(imgBytes)).build();
            }

Убедитесь, что вы не указали путь восстановления.

0 голосов
/ 02 апреля 2012

Поскольку ресурс встроен в вашу войну / банку, вам нужно использовать ClassLoader, чтобы загрузить его для вас:

Что-то вроде:

@Path("/image/{file}")
public class ImageResource
{
   @Context
   private UriInfo uri;

   @GET
   @Produces("image/jpg")
   public Response getFullImage(@PathParam("file") String fileName)
   {
      Response response = null;
      String contextRoot = getUri().getBaseUri().toString();

      try
      {
         // load resource via classloader since it's embedded in war/jar
         BufferedImage image = ImageIO.read(ImageResource.class.
                                 getResourceAsStream(/images/" + fileName));
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         ImageIO.write(image, "jpg", baos);
         byte[] imgBytes = baos.toByteArray();

         response = Response.ok(new ByteArrayInputStream(imgBytes)).build();
      }
      catch (IOException e)
      {
         System.err.println("Error reading image file..." + e.getMessage());
         e.printStackTrace();
      }

      return response;
   }

   private UriInfo getUri() {
      return uri;
   }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...