From 30e858fa504b268b9b436afca0a1259cf6e8c488 Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期二, 19 八月 2025 11:01:40 +0800
Subject: [PATCH] 优化

---
 server/src/main/java/com/doumee/core/utils/azure/AzureBlobUtil.java |  146 +++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 129 insertions(+), 17 deletions(-)

diff --git a/server/src/main/java/com/doumee/core/utils/azure/AzureBlobUtil.java b/server/src/main/java/com/doumee/core/utils/azure/AzureBlobUtil.java
index 4f1c383..566a07e 100644
--- a/server/src/main/java/com/doumee/core/utils/azure/AzureBlobUtil.java
+++ b/server/src/main/java/com/doumee/core/utils/azure/AzureBlobUtil.java
@@ -1,17 +1,29 @@
 package com.doumee.core.utils.azure;
 
+import com.alibaba.fastjson.JSONObject;
 import com.azure.core.http.rest.Response;
-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 com.azure.storage.blob.models.BlobRequestConditions;
-import com.azure.storage.blob.models.BlockBlobItem;
+import com.azure.core.http.rest.RestProxy;
+import com.azure.identity.DefaultAzureCredentialBuilder;
+import com.azure.storage.blob.*;
+import com.azure.storage.blob.models.*;
 import com.azure.storage.blob.options.BlobParallelUploadOptions;
+import com.azure.storage.blob.options.BlobUploadFromFileOptions;
+import com.azure.storage.blob.sas.BlobContainerSasPermission;
+import com.azure.storage.blob.specialized.BlobInputStream;
+import com.azure.storage.common.StorageSharedKeyCredential;
+import io.netty.handler.logging.ByteBufFormat;
+import io.netty.handler.logging.LogLevel;
+import reactor.util.context.ContextView;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 
+import javax.servlet.ServletOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
+import java.io.UncheckedIOException;
+import java.nio.file.Path;
+import java.time.OffsetDateTime;
 
 @Data
 @Slf4j
@@ -28,55 +40,155 @@
 
     public AzureBlobUtil(String accountName, String accountKey, String endpoint, String container){
         try {
+
             this.accountKey = accountKey;
             this.accountName = accountName;
             this.endpoint = endpoint;
             this.container = container;
-            this.connectionString = "DefaultEndpointsProtocol=https;AccountName=" + this.accountName + ";AccountKey=" + this.accountKey + ";EndpointSuffix=" + endpoint;
-            this.blobServiceClient = new BlobServiceClientBuilder().connectionString(connectionString).buildClient();
-            this.blobContainerClient = this.blobServiceClient.getBlobContainerClient(this.container);
+//            this.connectionString = "DefaultEndpointsProtocol=https;AccountName=" + this.accountName + ";AccountKey=" + this.accountKey + ";EndpointSuffix=" + endpoint;
+//            this.blobServiceClient = new BlobServiceClientBuilder().connectionString(connectionString).buildClient();
+//            this.blobServiceClient = new BlobServiceClientBuilder()
+//                    .endpoint(endpoint)
+//                    .sasToken(accountKey)
+//                    .buildClient();
+           initClient();
         }catch (Exception e) {
             e.printStackTrace();
+            log.error("鍒濆鍖朆LOB瀹㈡埛绔紓甯�0=========="+e.getMessage());
         }
 
     }
 
     public   void initClient( )   {
+        if(this.blobServiceClient!=null){
+            log.error("鍒濆鍖朆LOB瀹㈡埛绔凡瀹屾垚锛屾棤闇�閲嶅鎺堟潈==========");
+            return;
+        }
         try {
-            this.blobServiceClient = new BlobServiceClientBuilder().connectionString(connectionString).buildClient();
-            this.blobContainerClient = this.blobServiceClient.getBlobContainerClient(this.container);
+            StorageSharedKeyCredential credential = new StorageSharedKeyCredential(accountName, accountKey);
+            // Azure SDK client builders accept the credential as a parameter
+            this.blobServiceClient  = new BlobServiceClientBuilder()
+                    .endpoint(endpoint)
+                    .credential(credential)
+                    .buildClient();
+            this.blobContainerClient = this.blobServiceClient.createBlobContainerIfNotExists(this.container);
+            this.blobContainerClient.setAccessPolicy(PublicAccessType.CONTAINER, null);
+//            this.blobContainerClient = this.blobServiceClient.getBlobContainerClient(this.container);
+//            String endpointString = String.format("https://%s.blob.core.windows.net/%s",
+//                    accountName, container);
+//
+//            this.blobContainerClient = new BlobContainerClientBuilder()
+//                    .endpoint(endpointString)
+//                    .credential(new DefaultAzureCredentialBuilder().build())
+//                    .buildClient();
         }catch (Exception e) {
             e.printStackTrace();
+            log.error("鍒濆鍖朆LOB瀹㈡埛绔紓甯�1=========="+e.getMessage());
         }
     }
-    public   void uploadFile(String fileName, InputStream data)   {
+
+    public void downloadBlobToStream(String  blob, ServletOutputStream outputStream) {
+        BlobClient blobClient =this.getBlobContainerClient().getBlobClient(blob);
+        blobClient.downloadStream(outputStream);
+    }
+    public BlobInputStream readBlobFromStream(String  blob) {
+        BlobClient blobClient =this.getBlobContainerClient().getBlobClient(blob);
+        // Opening a blob input stream allows you to read from a blob through a normal
+        // stream interface
+        try (BlobInputStream blobStream = blobClient.openInputStream()) {
+            blobStream.read();
+            return blobStream ;
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return  null;
+    }
+    public BlobInputStream readBlobFromStream(BlobClient blobClient) {
+        // Opening a blob input stream allows you to read from a blob through a normal
+        // stream interface
+        try (BlobInputStream blobStream = blobClient.openInputStream()) {
+            blobStream.read();
+            return blobStream;
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+    public   boolean upload(String fileName, InputStream data)   {
         try {
             if(getBlobContainerClient() == null){
                 initClient();
             }
             BlobClient client = this.blobContainerClient.getBlobClient(fileName);
             client.upload(data, data.available(), true);
+            return true;
         }catch (Exception e) {
             e.printStackTrace();
         }
+
+        return false;
     }
-    public  boolean uploadFileWithResponse(String fileName, InputStream inputStream)   {
+
+    public void uploadBlockBlobWithTransferOptions(BlobContainerClient blobContainerClient, Path filePath) {
+        String fileName = filePath.getFileName().toString();
+        BlobClient blobClient = blobContainerClient.getBlobClient(fileName);
+
+        ParallelTransferOptions parallelTransferOptions = new ParallelTransferOptions()
+                .setBlockSizeLong((long) (4 * 1024 * 1024)) // 4 MiB block size
+                .setMaxConcurrency(2)
+                .setMaxSingleUploadSizeLong((long) 8 * 1024 * 1024); // 8 MiB max size for single request upload
+
+        BlobUploadFromFileOptions options = new BlobUploadFromFileOptions(filePath.toString());
+        options.setParallelTransferOptions(parallelTransferOptions);
+
         try {
+            Response<BlockBlobItem> blockBlob = blobClient.uploadFromFileWithResponse(options, null, null);
+        } catch (UncheckedIOException ex) {
+            System.err.printf("Failed to upload from file: %s%n", ex.getMessage());
+        }
+    }
+    /*public  boolean uploadFileWithResponse(String fileName, InputStream inputStream)   {
+        try {
+            log.error("BLOB涓婁紶寮�鍙戯細........"+fileName);
             if(getBlobContainerClient() == null){
+                log.error("BLOB涓婁紶寮�鍙戯細........鍒濆鍖栧鎴风");
                 initClient();
             }
             BlobParallelUploadOptions options = new BlobParallelUploadOptions(inputStream, inputStream.available());
             options.setRequestConditions(new BlobRequestConditions().setIfNoneMatch("*"));
             Response<BlockBlobItem> rsp = this.blobContainerClient.getBlobClient(fileName).uploadWithResponse(options, null, null);
-            if(rsp.getStatusCode()==201)  {
-                log.info("涓婁紶鎴愬姛锛�........"+fileName);
+            if(rsp!=null && rsp.getStatusCode()==201)  {
+                log.info("BLOB涓婁紶鎴愬姛锛�........"+fileName);
+                log.error("BLOB涓婁紶鎴愬姛锛�........"+fileName);
                 return true;
             }
+            log.error("BLOB涓婁紶澶辫触锛�........"+ JSONObject.toJSONString(rsp));
         }catch (Exception e) {
             e.printStackTrace();
-            log.info("涓婁紶澶辫触锛�........"+e.getMessage());
+            log.error("BLOB涓婁紶澶辫触锛�........"+e.getMessage());
+        }
+        return false;
+    }*/
+    public  boolean uploadFileWithResponseAndSize(String fileName, InputStream inputStream,Integer size)   {
+        try {
+            log.error("BLOB涓婁紶寮�鍙戯細........"+fileName+"===============size:"+size);
+            if(getBlobContainerClient() == null){
+                log.error("BLOB涓婁紶寮�鍙戯細........鍒濆鍖栧鎴风");
+                initClient();
+            }
+            BlobParallelUploadOptions options = new BlobParallelUploadOptions(inputStream,(size!=null && size>0)?size: inputStream.available());
+            options.setRequestConditions(new BlobRequestConditions().setIfNoneMatch("*"));
+            Response<BlockBlobItem> rsp = this.blobContainerClient.getBlobClient(fileName).uploadWithResponse(options, null, null);
+            if(rsp!=null && rsp.getStatusCode()==201)  {
+                log.info("BLOB涓婁紶鎴愬姛锛�........"+fileName);
+                log.error("BLOB涓婁紶鎴愬姛锛�........"+fileName);
+                return true;
+            }
+            log.error("BLOB涓婁紶澶辫触锛�........"+ JSONObject.toJSONString(rsp));
+        }catch (Exception e) {
+            e.printStackTrace();
+            log.error("BLOB涓婁紶澶辫触锛�........"+e.getMessage());
         }
         return false;
     }
-
 }
\ No newline at end of file

--
Gitblit v1.9.3