It's possible to got a low footprint memory while upload or download file ?
Include low-memory footprint for file uploads and downloads in the Spring Boot microservice.
BlobStorageService.java :
import com.azure.storage.blob.BlobClient;
import com.azure.storage.blob.BlobServiceClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
@Service
public class BlobStorageService {
private final BlobServiceClient blobServiceClient;
@Value("${azure.storage.container-name}")
private String containerName;
public BlobStorageService(BlobServiceClient blobServiceClient) {
this.blobServiceClient = blobServiceClient;
}
public void uploadFile(MultipartFile file) throws IOException {
BlobClient blobClient = blobServiceClient.getBlobContainerClient(containerName).getBlobClient(file.getOriginalFilename());
try (InputStream inputStream = file.getInputStream()) {
blobClient.upload(inputStream, file.getSize(), true);
}
}
public InputStream downloadFile(String fileName) throws IOException {
BlobClient blobClient = blobServiceClient.getBlobContainerClient(containerName).getBlobClient(fileName);
if (!blobClient.exists()) {
throw new IOException("File not found in Azure Blob Storage");
}
return blobClient.openQueryInputStream(null);
}
}
BlobController.java :
import com.example.demo.service.BlobStorageService;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
@RestController
@RequestMapping("/api/blob")
public class BlobController {
private final BlobStorageService blobStorageService;
public BlobController(BlobStorageService blobStorageService) {
this.blobStorageService = blobStorageService;
}
@PostMapping("/upload")
public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
try {
blobStorageService.uploadFile(file);
return ResponseEntity.ok("File uploaded successfully: " + file.getOriginalFilename());
} catch (IOException e) {
return ResponseEntity.status(500).body("File upload failed: " + e.getMessage());
}
}
@GetMapping("/download/{fileName}")
public ResponseEntity<InputStreamResource> downloadFile(@PathVariable String fileName) {
try {
InputStream inputStream = blobStorageService.downloadFile(fileName);
return ResponseEntity.ok()
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName)
.body(new InputStreamResource(inputStream));
} catch (IOException e) {
return ResponseEntity.status(500).body(null);
}
}
}
AzureStorageConfig.java :
import com.azure.storage.blob.BlobServiceClient;
import com.azure.storage.blob.BlobServiceClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AzureStorageConfig {
@Value("${azure.storage.connection-string}")
private String connectionString;
@Bean
public BlobServiceClient blobServiceClient() {
return new BlobServiceClientBuilder()
.connectionString(connectionString)
.buildClient();
}
}
pom.xml :
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-storage-blob</artifactId>
<version>12.24.0</version>
</dependency>
<dependency>
<groupId>io.projectreactor.netty</groupId>
<artifactId>reactor-netty</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
application.properties :
azure.storage.connection-string=<ConnectionString>
azure.storage.container-name=<CotainerName>
The file is directly streamed to Azure Blob Storage using InputStream
, avoiding unnecessary memory consumption.
The openQueryInputStream(null)
method retrieves blob content as a stream, preventing the entire file from loading into memory.
Response :
Upload status:
Download status:
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4