gpt4 book ai didi

spring - 通过 Flux 和 DataBufferUtils.write 通过输出流将非常大的文件下载到 Azure Blob 存储时出现问题(

转载 作者:行者123 更新时间:2023-12-03 03:23:14 30 4
gpt4 key购买 nike

我需要通过 REST 下载非常大的文件并将其存储到 Azure Blobstorage。我面临着一些问题。

对于所有示例,我都使用此调用来获取数据

 var flux = this.webClient
.get()
.uri(urlToAssert)
.accept(MediaType.APPLICATION_OCTET_STREAM)
.exchangeToFlux(clientResponse ->
clientResponse.body(BodyExtractors.toDataBuffers()));

此代码适用于大小为 50MB、1GB、5GB 的文件。注意是直接将Files写入文件系统。

try (OutputStream outputStream = new FileOutputStream(targetFile.resolve("testData.zip").toAbsolutePath().toString(), false)) {
DataBufferUtils.write(flux, outputStream).map(DataBufferUtils::release).blockLast(Duration.ofHours(22));
} catch (Exception e) {
throw new IllegalStateException(e);
}

所以我知道流处理没问题。现在我使用AzureBlob存储输出流。 50mb 有效。 1GB 也存在于 Blobstorage 中,但该方法一直卡在“try”中的某个位置

  try (OutputStream outputStream = this.blob.getOutputStreamParallel(destination, this.blob.getParallelTransferOptions())) {
DataBufferUtils.write(flux, outputStream).map(DataBufferUtils::release).blockLast(Duration.ofHours(22));
outputStream.flush();
} catch (IOException e) {
throw new IllegalStateException(e);
}
    public OutputStream getOutputStreamParallel(Path path, ParallelTransferOptions parallelTransferOptions) {
var blobClientTarget = this.containerClient.getBlobClient(relativePathUnix(path));
return blobClientTarget.getBlockBlobClient().getBlobOutputStream(parallelTransferOptions, null, null, null, null);
}
this.parallelTransferOptions = new ParallelTransferOptions()
.setBlockSizeLong(40 * Constants.MB)
.setMaxConcurrency(5)
.setProgressListener(bytesTransferred -> {
log.info("write bytes, bytes transferred '{}'", bytesTransferred);
});

在日志中我看到以下奇怪的事情

enter image description here

有人看到我的错误吗?或者 Azure BlobStorage 是否损坏?

最佳答案

使用下面的 Spring Boot 代码,我可以通过 REST 下载非常大的文件并将其存储到 Azure Blobstorage。

代码:

import com.azure.storage.blob.BlobClient;
import com.azure.storage.blob.BlobClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.io.ByteArrayInputStream;
import java.io.IOException;

@RestController
public class AzureBlobStorageServiceCon {

@Value("<storage-account-connection-string>")
private String connectionString;

@Value("<container-name>")
private String containerName;

@GetMapping("/download")
public ResponseEntity<String> uploadFile() throws IOException {

RestTemplate restTemplate = new RestTemplate();
byte[] fileBytes = restTemplate.getForObject("https://github.com/DasariKamali/blob/blob/main/10GB.zip", byte[].class);

BlobClient blobClient = new BlobClientBuilder()
.connectionString(connectionString)
.containerName(containerName)
.blobName("10GB.zip")
.buildClient();

ByteArrayInputStream inputStream = new ByteArrayInputStream(fileBytes);
blobClient.upload(inputStream, fileBytes.length);

return new ResponseEntity<>("File uploaded successfully", HttpStatus.OK);
}
}

输出:

enter image description here

使用输出端口,我可以通过 REST 下载非常大的文件并将 10GB blob 上传到我的存储帐户中的容器, enter image description here

我已成功将 10GB blob 上传到 Azure 门户 中存储帐户中的容器, enter image description here

关于spring - 通过 Flux<DataBuffer> 和 DataBufferUtils.write 通过输出流将非常大的文件下载到 Azure Blob 存储时出现问题(,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76332961/

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