Do
- Rückkehr
ResponseEntity<Resource>
aus einer Handler-Methode
- Geben Sie an.
Content-Type
- Satz
Content-Disposition
falls erforderlich:
- Dateiname
- Typ
inline
um die Vorschau in einem Browser zu erzwingen
attachment
um einen Download zu erzwingen
Ejemplo
@Controller
public class DownloadController {
@GetMapping("/downloadPdf.pdf")
// 1.
public ResponseEntity<Resource> downloadPdf() {
FileSystemResource resource = new FileSystemResource("/home/caco3/Downloads/JMC_Tutorial.pdf");
// 2.
MediaType mediaType = MediaTypeFactory
.getMediaType(resource)
.orElse(MediaType.APPLICATION_OCTET_STREAM);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(mediaType);
// 3
ContentDisposition disposition = ContentDisposition
// 3.2
.inline() // or .attachment()
// 3.1
.filename(resource.getFilename())
.build();
headers.setContentDisposition(disposition);
return new ResponseEntity<>(resource, headers, HttpStatus.OK);
}
}
Erläuterung
Rückkehr ResponseEntity<Resource>
Wenn Sie eine ResponseEntity<Resource>
El ResourceHttpMessageConverter
schreibt den Inhalt der Datei
Beispiele für Resource
Implementierungen:
Geben Sie an. Content-Type
ausdrücklich :
Grund: siehe " FileSystemResource wird mit dem Inhaltstyp json zurückgegeben " Frage
Optionen:
- Hardcode der Kopfzeile
- Verwenden Sie die
MediaTypeFactory
vom Frühling. Die MediaTypeFactory
Karten Resource
a MediaType
unter Verwendung der /org/springframework/http/mime.types
Datei
- Verwenden Sie eine Bibliothek eines Drittanbieters wie Apache Tika
Satz Content-Disposition
falls erforderlich :
Über Content-Disposition
Kopfzeile:
Der erste Parameter im HTTP-Kontext ist entweder inline
(Standardwert, der angibt, dass sie innerhalb der Webseite oder als Webseite angezeigt werden kann) oder attachment
(was anzeigt, dass es heruntergeladen werden soll; die meisten Browser zeigen einen "Speichern unter"-Dialog an, der mit dem Wert der Dateinamensparameter vorausgefüllt ist, falls vorhanden).
Utilice ContentDisposition
in der Anwendung:
-
An Vorschau eine Datei in einem Browser:
ContentDisposition disposition = ContentDisposition
.inline()
.filename(resource.getFilename())
.build();
-
Um eine herunterladen :
ContentDisposition disposition = ContentDisposition
.attachment()
.filename(resource.getFilename())
.build();
Utilice InputStreamResource
sorgfältig :
Geben Sie an. Content-Length
unter Verwendung der HttpHeaders#setContentLength
Methode, wenn:
- Die Länge ist bekannt
- Sie verwenden
InputStreamResource
Der Grund: Der Frühling will nicht schreiben Content-Length
para InputStreamResource
weil Spring die Länge der Ressource nicht bestimmen kann. Hier ist ein Codeschnipsel aus ResourceHttpMessageConverter
:
@Override
protected Long getContentLength(Resource resource, @Nullable MediaType contentType) throws IOException {
// Don't try to determine contentLength on InputStreamResource - cannot be read afterwards...
// Note: custom InputStreamResource subclasses could provide a pre-calculated content length!
if (InputStreamResource.class == resource.getClass()) {
return null;
}
long contentLength = resource.contentLength();
return (contentLength < 0 ? null : contentLength);
}
In anderen Fällen setzt Spring die Content-Length
:
~ $ curl -I localhost:8080/downloadPdf.pdf | grep "Content-Length"
Content-Length: 7554270