Как да зареждам ресурси извън classpath?

Използвам spring framework в webapplication и бих искал да заредя ресурси (*.jpeg), съхранени извън classpath.

Извиквам GET метод на някакъв контролер. Работи, когато извикам снимката от classpath. Но когато извиквам пътища като: /ext/media/photos/photo.png, file:/ext/media/photos/photo.png, /home/user/ext/media/photos/photo.png, http://some-web-image, това не работи.

@RequestMapping(value = "/loadPhoto", method = RequestMethod.GET, produces = MediaType.IMAGE_PNG_VALUE)
public ResponseEntity<byte[]> loadPhoto() throws IOException {
    InputStream in = servletContext.getResourceAsStream("/ext/media/photos/photo.png");
    return new ResponseEntity<byte[]>(IOUtils.toByteArray(in), HttpStatus.CREATED);
}

Опитах се да съпоставя url с реално местоположение в пролетен контекст

<mvc:resources mapping="/ext/media/photos/**" location="file:/home/user/ext/media/photos/"/>

Но все още не мога да получа ресурса. Това правилният начин ли е как да получите ресурс извън classpath?


person misco    schedule 18.05.2015    source източник


Отговори (1)


Можете да използвате FileSystemResource. Не е необходимо да връщате byte[]. Spring има конвертор за производство на самия byte[].

@RequestMapping(value = "/loadPhoto", method = RequestMethod.GET, produces = MediaType.IMAGE_PNG_VALUE)
public ResponseEntity<FileSystemResource> loadPhoto() throws IOException {
    FileSystemResource res = new FileSystemResource("/ext/media/photos/photo.png");
    return new ResponseEntity<FileSystemResource>(res, HttpStatus.CREATED);
}
person Sotirios Delimanolis    schedule 18.05.2015
comment
@misco Мисля, че има решение и с mvc:resources и вероятно е по-ефективно с механизма си за кеширане. Ще видя дали мога да го тествам по-късно и да редактирам отговора си. - person Sotirios Delimanolis; 18.05.2015
comment
Благодаря, ще бъде добре да разберете защо решението с mvc:resources не работи. - person misco; 18.05.2015
comment
@misco Така че в крайна сметка опитах с <mvc:resources ... /> и работи добре за мен. Ще трябва да дадете повече подробности, ако искате да разберете защо не работи за вас. Помислете за задаване на нов въпрос. - person Sotirios Delimanolis; 19.05.2015