2014-10-09 14 views
6

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

+0

z kontekstu Lepiej jest przesyłanie obrazu w 'path' dysku, a przy użyciu bazy danych –

+0

Przeszedłem przez to, ale w moim przypadku muszę przechowywać go w db, jakiekolwiek rozwiązanie? –

+0

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 –

Odpowiedz

3

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}'/>" > 
0

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

0

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); 
}