Otrzymuję dane obrazu (jako byte[]
) z DB. Jak zwrócić ten obraz w @ResponseBody
?
EDYTOWAĆ
Zrobiłem to bez @ResponseBody
użycia HttpServletResponse
jako parametru metody:
@RequestMapping("/photo1")
public void photo(HttpServletResponse response) throws IOException {
response.setContentType("image/jpeg");
InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg");
IOUtils.copy(in, response.getOutputStream());
}
Używanie @ResponseBody
z zarejestrowanym org.springframework.http.converter.ByteArrayHttpMessageConverter
konwerterem, jak powiedział @Sid, nie działa dla mnie :(.
@ResponseBody
@RequestMapping("/photo2")
public byte[] testphoto() throws IOException {
InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg");
return IOUtils.toByteArray(in);
}
źródło
Oprócz zarejestrowania domeny
ByteArrayHttpMessageConverter
możesz użyćResponseEntity
zamiast@ResponseBody
. U mnie działa następujący kod:źródło
Używając Spring 3.1.x i 3.2.x, powinieneś to zrobić w następujący sposób:
Metoda kontrolera:
Oraz adnotacja mvc w pliku servlet-context.xml:
źródło
Oprócz kilku odpowiedzi tutaj kilka wskazówek (wiosna 4.1).
O ile nie masz żadnych konwerterów wiadomości skonfigurowanych w swoim WebMvcConfig, posiadanie
ResponseEntity
wewnątrz@ResponseBody
działa dobrze.Jeśli tak, to znaczy masz
MappingJackson2HttpMessageConverter
skonfigurowany (jak ja) za pomocąResponseEntity
zwrotów aorg.springframework.http.converter.HttpMessageNotWritableException
.Jedynym działającym rozwiązaniem w tym przypadku jest owinięcie
byte[]
w@ResponseBody
następujący sposób:W takim przypadku pamiętaj o prawidłowym skonfigurowaniu konwerterów komunikatów (i dodaj a
ByteArrayHttpMessageConverer
) w swoim WebMvcConfig, na przykład:źródło
W kontekście aplikacji zadeklaruj AnnotationMethodHandlerAdapter i registerByteArrayHttpMessageConverter:
również w metodzie obsługi ustaw odpowiedni typ treści dla swojej odpowiedzi.
źródło
Pracował dla mnie.
źródło
Preferuję ten:
Zmień typ mediów na jaki kiedykolwiek masz format obrazu.
źródło
ResourceLoader
, ale utworzenie ścieżki z zewnętrznego wejścia, jak w twoim przykładzie, to zły pomysł: cwe.mitre.org/data/definitions/22.htmlTo dla mnie praca na Spring 4.
źródło
Żadna z odpowiedzi nie działała dla mnie, więc udało mi się to zrobić w ten sposób:
Ustawienie
Content-Disposition
nagłówka Udało mi się pobrać plik z@ResponseBody
adnotacją dotyczącą mojej metody.źródło
W odpowiedzi należy określić typ nośnika. Używam adnotacji @GetMapping z producentem = MediaType.IMAGE_JPEG_VALUE. @RequestMapping będzie działać tak samo.
Bez typu multimediów trudno odgadnąć, co faktycznie jest zwracane (w tym każdy, kto czyta kod, przeglądarkę i oczywiście samą Spring). Bajt [] po prostu nie jest określony. Jedynym sposobem określenia typu multimediów na podstawie bajtu [] jest węszenie i zgadywanie.
Podanie typu multimediów to tylko najlepsza praktyka
źródło
Oto jak robię to z Spring Boot i Guava:
źródło
Wiosną 4 jest to bardzo łatwe, nie trzeba wprowadzać żadnych zmian w fasoli. Zaznacz typ zwrotu tylko w @ResponseBody.
Przykład:-
źródło
Myślę, że może potrzebujesz usługi do przechowywania przesyłania plików i pobierania tego pliku. Sprawdź więcej szczegółów tutaj
1) Utwórz usługę magazynu
2) Utwórz Rest Controller, aby przesłać i pobrać plik
}
źródło