文件遍历上传腾讯云存储COS,根据文件大小自动选择上传方式并且返回url

该博客介绍了如何使用Java实现腾讯云对象存储(COS)的文件批量上传功能。通过初始化用户身份信息、设置存储桶区域和名称,创建COSClient和TransferManager,实现了根据文件大小自动选择简单上传或分块上传。此外,还提供了上传进度的显示以及错误处理机制。
摘要由CSDN通过智能技术生成

工具类实现:

import java.io.File;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author 天龙大帅比
 * @data 2021/8/6 14:45
 */

public class TencentCosUtil {
 
	//首先得先注册腾讯云对象存储~
	
    // 1.初始化用户身份信息
    private static COSCredentials cred = new BasicCOSCredentials("AK开头的放这", "另一个放这");
    // 2.设置bucket的区域
    private static ClientConfig clientConfig = new ClientConfig(new Region("你自己的区域"));
    // 3.bucket的命名规则为{name}-{appid} ,存储桶名称
    private static String bucketName = "你自己的bucketName ";
    // 4.可以使用访问域名进行内网访问
    private static String Url = "你自己的腾讯云url";

    /**
     * 上传文件到腾讯COS, 根据文件大小自动选择简单上传或者分块上传。
     * 可根据自己的网络状况自定义线程池
     */
    public static List<String> uploadFile(File localFile) {
        //返回腾讯云上传后的文件列表
        List<String> tencentURLList = new ArrayList<>();
        if (localFile == null) {
            return null;
        } else {
            // 生成cos客户端
            COSClient cosclient = new COSClient(cred, clientConfig);
            ExecutorService threadPool = Executors.newFixedThreadPool(16);
            // 传入一个threadpool, 若不传入线程池, 默认TransferManager中会生成一个单线程的线程池。
            TransferManager transferManager = new TransferManager(cosclient, threadPool);

            //遍历目录下的文件,存进数组
            File[] fs = localFile.listFiles();
            File uploadedFile;
            String key = "";
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
            LocalDateTime nowTime = LocalDateTime.now();
            String timeFolder = nowTime.format(formatter);

            for (int i = 0; i < fs.length; i++) {
                uploadedFile = fs[i];
                System.out.println("里面有文件" + i + ":" + uploadedFile);
                String fileName = uploadedFile.getName();

                String suffix = FileUtil.getFileType(uploadedFile);
                //判断是否为图片~~
                if (suffix.equals("jpg") || suffix.equals("jpeg")) {
                    key = "/images/" + timeFolder + "/" + fileName;
                } else {
                    key = "/videos/" + timeFolder + "/" + fileName;
                }
                PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, uploadedFile);
                // 设置高级接口的分块上传阈值和分块大小为10MB,这里可以自己设置
                TransferManagerConfiguration transferManagerConfiguration = new TransferManagerConfiguration();
                transferManagerConfiguration.setMultipartUploadThreshold(10 * 1024 * 1024);
                transferManagerConfiguration.setMinimumUploadPartSize(10 * 1024 * 1024);
                transferManager.setConfiguration(transferManagerConfiguration);

                try {
                    long startTime = System.currentTimeMillis();
                    Upload upload = transferManager.upload(putObjectRequest);
                    UploadResult uploadResult = upload.waitForUploadResult();
                    long endTime = System.currentTimeMillis();
                    System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
                    System.out.println("上传成功!" + i + "used time: " + (endTime - startTime) / 1000 + "s");
                    System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
                    System.out.println("去看看" + Url + key);
                    System.out.println(uploadResult.getETag());
                    tencentURLList.add(Url + key);
                } catch (CosServiceException e) {
                    e.printStackTrace();
                    System.out.println("上传失败!CosServiceException");
                } catch (CosClientException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    System.out.println("上传失败!InterruptedException");
                }
            }
            transferManager.shutdownNow();
            cosclient.shutdown();
            return tencentURLList;
        }
    }
}

在外部调用的时候,也写一个集合来存储返回的list就行了,再遍历获取!
单个文件就修改一下相应的list代码为String就行~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天龙真人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值