Ich benutze Feder mvc, hateoas. Ich habe eine Controller-Aktion, die wie folgt aussiehtSo erstellen Sie eine Verknüpfung, die auf Spring-Controller-Aktion zeigt, die void zurückgibt
@RequestMapping(value = "/images/{userId}/{publicUrl}/{fileName:.+}", method = RequestMethod.GET)
public void image(@PathVariable Integer userId, @PathVariable String publicUrl, @PathVariable String fileName, HttpServletRequest request, HttpServletResponse response) throws Exception {
try(HellodoxAws aws = haws;){
.....
.....
response.setContentType(image.getObjectMetadata().getContentType());
response.setHeader("ETag",image.getObjectMetadata().getETag());
response.setHeader("Cache-Control",image.getObjectMetadata().getCacheControl());
response.setHeader("Last-Modified",image.getObjectMetadata().getLastModified().toString());
IOUtils.copy(image.getObjectContent(), response.getOutputStream());
}catch (Exception e) {
if(e instanceof AmazonS3Exception){
int statusCode = ((AmazonS3Exception) e).getStatusCode();
//System.out.println("Status Code : "+statusCode);
response.setContentType("image/jpeg");
if(statusCode==HttpStatus.NOT_MODIFIED.value()){
response.setHeader("ETag",((AmazonS3Exception) e).getAdditionalDetails().get("ETag"));
response.setHeader("Cache-Control",((AmazonS3Exception) e).getAdditionalDetails().get("Cache-Control"));
response.setHeader("Last-Modified",((AmazonS3Exception) e).getAdditionalDetails().get("Last-Modified"));
}
response.setStatus(statusCode);
}
}
}
Diese Aktion funktioniert einwandfrei.
Jetzt was ich will, ist URL zu veröffentlichen, um auf jedes Profilbild zuzugreifen. JSON-Format ist soetwas wie dieses
{
"profileId" : 342308,
"userId" : 342308,
"firstname" : "Henry",
"lastname" : "Seol",
"title" : "Mr.",
"largeImageUrl" : "https://<host>/image/<id>/<publicUrl>/<filename1.jpg>",
"thumbImageUrl" : "https://<host>/image/<id>/<publicUrl>/<filename2.jpg>"
}
ich diesen Link anstelle des Wertes für „largeImageUrl“ und „thumbImageUrl“ hinzufügen möchten.
Wenn ich linkTo Funktion von hateoas verwenden, sagt es Controller entsprechende Methode sollte nicht void zurückgeben.
Wie erstellt man diese Art von dynamischem Link und fügt sie der Ressource hinzu?
Sie können 'linkTo (...). Slash (...) ...' immer als letzten Ausweg verwenden. Ich frage mich, warum der Rückgabetyp der Methode "ungültig" ist, wenn Sie tatsächlich ein Bild zurückgeben. Die Verwendung von 'HttpServletRequest' oder' HttpServletResponse' als Parameter ist ein No-Go. – zeroflagL
Können Sie mir vorschlagen, wie Sie das Bild in diesem Controller zurückgeben, indem Sie nicht HttpServletRequest oder HttpServletResponse als Parameter oder eine andere Lösung für diesen Controller verwenden? –
Eine Alternative besteht darin, 'ResponseEntity' zurückzugeben. Die 'InputStreamResource' kann mit 'new InputStreamResource (image.getObjectContent())' erstellt werden, nehme ich an. –
zeroflagL