gpt4 book ai didi

java - 如何在Java中获取FileInputStream中的azure blob存储内容?

转载 作者:行者123 更新时间:2023-12-02 06:26:46 24 4
gpt4 key购买 nike

我正在开发 API(Spring Boot)。其中我需要在 get 方法的响应主体中返回 FileInputStream。

预期 -当前端调用 get-files API 时,浏览器上应该打开文件下载提示。

问题 - 我们无法使用 blob.downloadToFile 方法,因为它将在本地计算机(或托管 API 的位置)上下载文件,并且我们需要可以直接发送文件的东西到 API 调用的前端。然而,还有另一种方法blob.download(),它返回OutputStream,而API调用时无法返回该OutputStream。

有没有什么方法可以将 OutputStream 转换为 FileInputStream,而无需保存到设备上的实际文件。

示例代码-

public ByteArrayOutputStream downloadBlob() throws URISyntaxException, InvalidKeyException, StorageException, IOException {
String storageConnectionString = "DefaultEndpointsProtocol=https;" + "AccountName=" + accountName + ";"
+ "AccountKey=" + accountKey;

CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);

CloudBlobClient blobClient = storageAccount.createCloudBlobClient();

final CloudBlobContainer container = blobClient.getContainerReference("container name");


CloudBlockBlob blob = container.getBlockBlobReference("image.PNG");
ByteArrayOutputStream outputStream =new ByteArrayOutputStream();
blob.download(outputStream);
System.out.println("file downloaded");

return outputStream;
}

注意 - 文件可以是任何类型。

最佳答案

这是解决方案 - 在浏览器中点击 API 后,您的文件将在浏览器中下载 -

package com.example.demo.controllers;

import com.azure.storage.blob.BlobClient;
import com.azure.storage.blob.BlobContainerClient;
import com.azure.storage.blob.BlobServiceClient;
import com.azure.storage.blob.BlobServiceClientBuilder;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;


@RestController
public class FileDownload {
@GetMapping(path="/download-file")
public ResponseEntity<Resource> getFile(){
String fileName = "Can not find symbol.docx";
//azure credentials
String connection_string = "Connection String of storage account on azure";

BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().connectionString(connection_string).buildClient();

BlobContainerClient containerClient= blobServiceClient.getBlobContainerClient("Container name");
System.out.println(containerClient.getBlobContainerName());

BlobClient blob = containerClient.getBlobClient(fileName);

//creating an object of output stream to recieve the file's content from azure blob.
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
blob.download(outputStream);

//converting it to the inputStream to return
final byte[] bytes = outputStream.toByteArray();
ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
ByteArrayResource resource = new ByteArrayResource(bytes);
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"");

return ResponseEntity.ok().contentType(MediaType.APPLICATION_OCTET_STREAM)
.headers(headers)
.body(resource);
}

}

关于java - 如何在Java中获取FileInputStream中的azure blob存储内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63523766/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com