Używam wiosny 4 i hibernacji 4 do przesyłania i pobierania obrazu do iz bazy danych. Przekonwertowałem obraz wieloczęściowy na tablicę bajtów i zapisałem w bazie danych. Moje zapytanie dotyczy sposobu pobrania tego obrazu z bazy danych i wyświetlenia tablicy bajtów w jsp bez zapisywania jej w systemie lokalnym.Załaduj obraz wiosną mvc
Odpowiedz
Ponieważ nie wspomniano o strukturze db do przechowywania obrazu, uważam, że przechowujesz go w typie danych blob
.
Część 1: ControllerClass
Po pobraniu obrazu z db, a następnie zakodować ten obraz za pomocą Base64.encode
i map, że obraz do JSP (używając java.util.map
).
Map<String, Object> model = new HashMap<String, Object>();
model.put("myImage", Base64.encode(MyImage)); //MyImage (datatype 'byte[]') is the image retrieved from DB
return new ModelAndView("display", model); //display is the name of jsp on which you want to display image
Część 2: JSP
następnie wyświetlać je na JSP
poprzez dekodowanie tablicę bajtów,
<img id="myImg" name="myImg" src="data:image/jpg;base64,<c:out value='${myImage}'/>" >
Dosłownie co robimy jest
w dao metoda
public InputStream get_user_photo_by_id(int id_user) throws Exception {
Blob blob_photo;
String sql = "Select b_photo_file from user_master where id_user = ?";
blob_photo = getJdbcTemplate().queryForObject(sql, new Object[] {id_user}, Blob.class);
if(blob_photo!=null)
return blob_photo.getBinaryStream();
else
return null;
}
W metodzie usług właśnie powrocie InputStream do kontrolera
W kontrolerze
@ResponseBody
@RequestMapping(value = "admin/user/{id}/photo", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE)
public byte[] testphoto(@PathVariable("id") int id_sys_user, HttpSession ses) throws Exception {
byte[] thumb = null;
InputStream in = UserOps.getUserPhotobyId(id_sys_user);
if(in!=null){
thumb = IOUtils.toByteArray(in);
}
return thumb;
}
teraz wystarczy podłączyć admin/user/{id}/zdjęć lub dowolny ciąg chcesz korzystać w < img src = ""> tak długo, jak pasują i masz swoje zdjęcie
Możesz zrobić to bez problemu. Musisz skonfigurować kontroler, który wyśle obraz, gdy zażąda go przeglądarka. Ale tutaj kontroler nie umieszcza go w Modelu, aby dać mu widok, ale bezpośrednio generuje odpowiedź HTTP. Następnie na stronie JSP wystarczy wskazać odpowiedni adres URL.
Oto (częściowe) przykładem tego, co mogłoby być:
@RequestMapping(value = "/img/{imgid}")
public void getFile(HttpServletRequest request, @PathVariable(value = "imgid") long imgid, HttpServletResponse response) throws IOException {
contentType = "img/png"; //or what you need
response.setContentType(contentType);
// find the image bytes into into byte[] imgBytes
response.setContentLength((int) imgBytes.length);
response.setStatus(HttpServletResponse.SC_OK);
OutputStream os = response.getOutputStream();
os.write(imgBytes);
}
z kontekstu Lepiej jest przesyłanie obrazu w 'path' dysku, a przy użyciu bazy danych –
Przeszedłem przez to, ale w moim przypadku muszę przechowywać go w db, jakiekolwiek rozwiązanie? –
Przepraszam, nie znam się na hibernacji. po prostu spróbuj tego http://stackoverflow.com/questions/24567553/save-and-retrieve-image-from-database-using-spring-mvc-and-hibernate-rest-servic i http://stackoverflow.com/questions/17384928/hibernacja-how-to-retrieve-an-image-from-the-database –