腾讯云Cos分布式-多线程分片上传核心代码

原文地址:https://cloud.tencent.com/developer/article/2540765?from=15425&policyId=20240000&traceId=01k0rgzy5arnfbtvf098fmkzkq&frompage=seopage

好吧,我还是把我后面肯能用得到的,原文博主贴的核心代码转一下,后面看看怎么用.net实现一下。这里就全系转载了,参考原作者的思路,感谢。

// 分片上传核心逻辑
public class MultipartUploader {
    private static final int PART_SIZE = 5 * 1024 * 1024; // 5MB分片
    
    public void upload(File file, String bucketName) {
        // 初始化分片上传
        InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(bucketName, file.getName());
        InitiateMultipartUploadResult initResponse = ossClient.initiateMultipartUpload(initRequest);
        
        // 创建线程池
        ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
        List<Future<PartETag>> futures = new ArrayList<>();
        
        // 分片并提交任务
        long fileLength = file.length();
        int partCount = (int) (fileLength / PART_SIZE);
        if (fileLength % PART_SIZE != 0) partCount++;
        
        for (int i = 0; i < partCount; i++) {
            long startPos = i * PART_SIZE;
            long curPartSize = Math.min(PART_SIZE, fileLength - startPos);
            UploadPartTask task = new UploadPartTask(initResponse.getUploadId(), 
                                                    bucketName, 
                                                    file.getName(), 
                                                    file, 
                                                    startPos, 
                                                    curPartSize, 
                                                    i + 1);
            futures.add(executor.submit(task));
        }
        
        // 等待所有分片完成
        List<PartETag> partETags = new ArrayList<>();
        for (Future<PartETag> future : futures) {
            partETags.add(future.get());
        }
        
        // 合并分片
        CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest(
            bucketName, file.getName(), initResponse.getUploadId(), partETags);
        ossClient.completeMultipartUpload(compRequest);
    }
}

// 分片上传任务
class UploadPartTask implements Callable<PartETag> {
    // 实现分片上传细节
    @Override
    public PartETag call() throws Exception {
        // 读取文件分片
        // 创建UploadPartRequest
        // 执行分片上传
        // 返回PartETag
    }
}

分片:

def calculate_part_size(file_size):
    # 根据文件大小动态调整分片
    if file_size <= 50 * 1024 * 1024:   # <50MB
        return 1 * 1024 * 1024          # 1MB分片
    elif file_size <= 5 * 1024 * 1024 * 1024: # <5GB
        return 5 * 1024 * 1024          # 5MB分片
    else:
        return 10 * 1024 * 1024         # 10MB分片

 

posted @ 2025-07-23 19:28  Wind_Swing_Dunn  阅读(15)  评论(0)    收藏  举报