阿里云OSS附件服务器:多线程异步批量操作(批量上传实例)

多线程批量上传OSS

一、OSS简介

阿里云存储服务(OpenStorageService,简称OSS),是阿里云对外提供的海量,安全,低成本,高可靠的云存储服务。

大家首先开通OSS,并且创建好Bucket,才能开始写代码使用它,参考博客:

OSS开通以及开通Bucket相关操作

二、单线程实现文件上传

在这里插入图片描述

这里创建三张图片,之后使用这三张图片进行上传操作

package com.example.oss;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.File;
import java.net.URL;

/**
 * @Author 胡孟帆
 * @Date 2021-11-19 9:12
 * @Function
 **/

@SpringBootTest
class OsssTests {

	public static final String endpoint = "你的endpoint";
	public static final String accessKeyId = "你的accessKeyId";
	public static final String accessKeySecret = "你的accessKeySecret";
	public static final String bucketName = "你的桶名";

    public static OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    @Test
    void contextLoads() {
    }

    public static void main(String[] args) throws InterruptedException {

        //单线程插入

        Long start = System.currentTimeMillis();
        String[] urls = new String[3];
        urls[0] = "E:/IDEABackground/wallhaven-j3dkjq.png";
        urls[1] = "E:/IDEABackground/wallhaven-rd6req.png";
        urls[2] = "E:/IDEABackground/wallhaven-rdpvmm.png";

        Thread uploaderThread = null;
        for (String url : urls) {
//            String fileBaseName = url.substring(url.lastIndexOf("/") + 1);
            try {
                ossClient.putObject(bucketName, "fileBaseName.png", new File(url));
                System.out.println(url + "上传图片完成!");
            } catch (Exception e) {
                System.out.println(url + "上传图片失败!");
                e.printStackTrace();
            }
        }
        Long end = System.currentTimeMillis();

        Long time  = end - start;
        System.out.println("time = " + time);
        ossClient.shutdown();
    }

}

结果:

在这里插入图片描述

可以看到,单线程上传三张图片最后用时 1698ms

三、实现Runnable接口

package com.example.oss;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.File;
import java.net.URL;

/**
 * @Author 胡孟帆
 * @Date 2021-11-19 9:27
 * @Function
 **/
@SpringBootTest
class OssApplicationTests {

	public static final String endpoint = "你的endpoint";
	public static final String accessKeyId = "你的accessKeyId";
	public static final String accessKeySecret = "你的accessKeySecret";
	public static final String bucketName = "你的桶名";

    public static OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    @Test
    void contextLoads() {
    }

    public static void main(String[] args) throws InterruptedException {

        //多线程插入

        Long start = System.currentTimeMillis();
        System.out.println("start = " + start);
        String[] urls = new String[3];
        urls[0] = "E:/IDEABackground/wallhaven-j3dkjq.png";
        urls[1] = "E:/IDEABackground/wallhaven-rd6req.png";
        urls[2] = "E:/IDEABackground/wallhaven-rdpvmm.png";

        Thread uploaderThread = null;
        for (String url : urls) {
            uploaderThread = new Thread(new Fileuploader(url,start));
            uploaderThread.start();

        }

        Thread.sleep(5000);
        ossClient.shutdown();
    }
    // 文件上传器
    static class Fileuploader implements Runnable{
        private final String fileURL;
        private final Long start;
        public Fileuploader(String fileURL,Long start) {
            this.fileURL = fileURL;
            this.start = start;
        }
        @Override
        public void run() {

            String fileBaseName = fileURL.substring(fileURL.lastIndexOf("/") + 1);
            try {

                ossClient.putObject(bucketName, fileBaseName, new File(fileURL));
                System.out.println(fileURL + "上传图片完成!");
                Long end = System.currentTimeMillis();
                Long time = end - start;
                System.out.println("time = " + time);

            } catch (Exception e) {
                System.out.println(fileURL + "上传图片失败!");
                e.printStackTrace();
            }
        }

    }
}

结果:
在这里插入图片描述

可以看到,实现Runnable上传三张图片最后用时 1079ms

三、使用CompletableFuture实现异步编程

package com.example.oss;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.File;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;

/**
 * @Author 胡孟帆
 * @Date 2021-11-19 10:36
 * @Function
 **/
@SpringBootTest
public class CompleteTableTests {
    @Test
    void contextLoads() {
    }

	public static final String endpoint = "你的endpoint";
	public static final String accessKeyId = "你的accessKeyId";
	public static final String accessKeySecret = "你的accessKeySecret";
	public static final String bucketName = "你的桶名";

    public static OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

    public static void main(String[] args) {

        //使用completableFuture多线程

        Long start = System.currentTimeMillis();
        String[] urls = new String[3];
        urls[0] = "E:/IDEABackground/wallhaven-j3dkjq.png";
        urls[1] = "E:/IDEABackground/wallhaven-rd6req.png";
        urls[2] = "E:/IDEABackground/wallhaven-rdpvmm.png";
        //异步无返回值
        for (String url : urls) {
            System.out.println("url = " + url);
            CompletableFuture<Void> f1 = CompletableFuture.runAsync(()->{
                System.out.println(start);
                try {
                    System.out.println(start);
                    ossClient.putObject(bucketName, "fileBaseName.png", new File(url));
                    System.out.println(url + "上传图片完成!");
                } catch (Exception e) {
                    System.out.println(url + "上传图片失败!");
                    e.printStackTrace();
                }

//                ossClient.shutdown();
            });
            f1.whenComplete((Long, throwable) -> {
                Long end = System.currentTimeMillis();
                Long time = end - start;
                System.out.println("time = " + time);
            });
        }
        try {
            Thread.sleep(10000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

结果:

在这里插入图片描述

可以看到,实现Runnable上传三张图片最后用时 1041ms

在这里插入图片描述
进入OSS控制台,可以看到图片已插入。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值