2 Mayıs 2023 Salı

SpringContext InputStreamResource Sınıfı - MediaType.APPLICATION_OCTET_STREAM İndirme

Giriş
Şu satırı dahil ederiz 
import org.springframework.core.io.InputStreamResource;
Açıklaması şöyle. Yani Resource arayüzünü gerçekleştirir.
It is a subclass of AbstractResource, which means that it implements the Resource interface. The Resource interface provides a number of methods for working with resources, such as getting the resource's URL, filename, and content type.
Açıklaması şöyle. Java'daki InputStream ve Spring'deki Resource arayüzü arasındaki köprüdür.
The purpose of InputStreamResource is to provide a bridge between the Spring Framework's resource handling capabilities and the input stream-based data sources. It allows you to treat an input stream as a resource that can be easily manipulated and managed within the Spring Framework's ecosystem.
constructor - InputStream

Örnek - Video İndirme
Şöyle yaparız. Burada bir ByteBufferBackedInputStream aslında bir InputStream, tek farkı içine bir ByteBuffer alması. Bu nesnesi kullanarak bir InputStreamResource yaratıyoruz ve ResponseEntity.body() metodu ile gönderiyoruz. Cevaptaki Content type APPLICATION_OCTET_STREAM yani ham byte verisi.
@GetMapping("{name}")
ResponseEntity<Resource> getMovieByName(@PathVariable String name) {
  return storage.pull(name)
    .map(Movie::movieByteBuffer)
    .map(ByteBuffer::slice)
    .map(ByteBufferBackedInputStream::new)
    .map(InputStreamResource::new)
    .<ResponseEntity<Resource>>map(resource ->
      ResponseEntity.ok()
        .contentType(MediaType.APPLICATION_OCTET_STREAM)
        .body(resource))
      .orElseGet(() -> ResponseEntity.notFound().build());
}
Örnek - Dosya İndirme
Elimizde veri tabanından sorgu yapıp dosyaya yazan şöyle bir kod olsun
@Override
public File getWholeFile(Long segmentId) throws IOException {
  ...
  File file = ...
  try (PrintWriter printWriter = new PrintWriter(new FileWriter(file))) {
    printWriter.println(HEADER);
    writeRowsToFile(segments, printWriter);
  }
  return file;
}
Şöyle yaparız. Sorgu sonucu olan dosyayı tek parça halinde indirir
@GetMapping("/{id}")
public ResponseEntity<Resource> getFileWhole(@PathVariable("id") Long segmentId) 
throws IOException {
  File file = fileService.getWholeFile(segmentId);
  InputStreamResource resource = new InputStreamResource(new FileInputStream(file));
  HttpHeaders headers = formHeaders(segmentId);
  return ResponseEntity.ok()
    .headers(headers)
    .body(resource);
}
formHeaders şöyle
private HttpHeaders formHeaders(Long segmentId) {
  HttpHeaders headers = new HttpHeaders();
  headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE);
  headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, CONTENT_DISPOSITION);
  headers.add(CONTENT_DISPOSITION, String.format("attachment; filename=segment_%d.csv",
    segmentId));
  return headers;
}


Hiç yorum yok:

Yorum Gönder