#java #spring #spring-mvc
#java #spring #spring-mvc
Вопрос:
Есть ли какой-либо способ сопоставить файл изображения с помощью Spring controller? В моем приложении Spring я хочу сохранить изображения в каталоге src / main / resources (я использую maven) и получить к ним доступ с помощью такого метода:
@RequestMapping(value="image/{theString}")
public ModelAndView image(@PathVariable String theString) {
return new ModelAndView('what should be placed here?');
}
строка theString
— это имя изображения (без расширения). При таком подходе я должен иметь возможность получать доступ к своим изображениям таким образом:
/webapp/controller_mapping/image/image_name
Кто-нибудь может указать направление для этого?
Комментарии:
1. Вы можете вернуть,
HttpEntity<byte[]>
содержащий ваше изображение и необходимые заголовки. Изображение может быть полученоgetResourceAsStream
методом classloader docs.oracle.com/javase/7/docs/api/java/lang /…2. @KonstantinV. Салихов, это должен быть ответ, чтобы вы могли получить некоторые очки интернет-брауни.
Ответ №1:
Вы можете вернуться HttpEntity<byte[]>
. Создайте новый экземпляр, предоставляющий массив байтов изображения и необходимые заголовки, такие как длина содержимого и тип mime, затем верните его из вашего метода. Байты изображения могут быть получены с помощью getResourceAsStream
метода classloader.
Ответ №2:
Это работает для меня. Может потребоваться некоторая очистка, но это работает. Исключение ServiceException — это просто базовое исключение.
Удачи!
package com.dhargis.example;
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("/image")
public class ImageController {
private static final Logger log = Logger.getLogger(ImageController.class);
private String filestore = "C:\Users\dhargis";
//produces = "application/octet-stream"
@RequestMapping(value = "/{filename:. }", method = RequestMethod.GET)
public void get( @PathVariable String filename,
HttpServletRequest request,
HttpServletResponse response) {
log.info("Getting file " filename);
try {
byte[] content = null;
File store = new File(filestore);
if( store.exists() ){
File file = new File(store.getPath() File.separator filename);
if( file.exists() ){
content = FileUtils.readFileToByteArray(file);
} else {
throw new ServiceException("File does not exist");
}
} else {
throw new ServiceException("Report store is required");
}
ServletOutputStream out = response.getOutputStream();
out.write(content);
out.flush();
out.close();
} catch (ServiceException e) {
log.error("Error on get", e);
} catch (IOException e) {
log.error("Error on get", e);
}
}
}
<!-- begin snippet: js hide: false -->