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

el/2024/5/21 21:12:48

多线程批量上传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);@Testvoid 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);@Testvoid 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;}@Overridepublic 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 {@Testvoid 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控制台,可以看到图片已插入。


http://www.ngui.cc/el/5277793.html

相关文章

Java互斥同步 关于Synchronized关键字与ReentrantLock的使用和比较

synchronized关键字的四种使用方法 1. 同步一个代码块 public void func1(){ // 同步代码块synchronized (this){//...}}它只作用于同一个对象&#xff0c;如果调用两个对象上的同步代码块不会同步 对于以下线程&#xff0c;由于调用同一个对象&#xff0c;所以实…

比 Json 还牛的 Protobuf 的编码须知(.proto文件该如何编写)

编码规范&#xff1a; 定义一个 message 消息类型&#xff1a; 字段编号尽量使用 16 &#xff08;虽然前15个 bytes 浪费了&#xff0c;但好处多多&#xff09; syntax "proto3";message SearchRequest {string query 1;int32 page_number 2;int32 result_per_…

Springboot 的三种注入方式对比

首先来看看 Spring 中的实例该如何注入&#xff0c;总结起来&#xff0c;无非三种&#xff1a; 属性注入set 方法注入构造方法注入 我们分别来看下。 1、属性注入 属性注入是大家最为常见也是使用最多的一种注入方式了&#xff0c;代码如下&#xff1a; Service public cl…

SELECT 语句的执行过程

SELECT 语句的执行过程为&#xff1a;连接、查询缓存、词法分析&#xff0c;语法分析&#xff0c;语义分析&#xff0c;构造执行树&#xff0c;生成执行计划、执行器执行计划&#xff0c;下面开始梳理一次完整的查询流程&#xff1a; 连接器 连接器负责与客户端建立连接,获取…

Unity3D 旧版Animation. Time.timeScale = 0暂停,播放动画.

需要用到Time.timeScale 0暂停&#xff0c;但个别地方需要播放动画&#xff0c;在Time.timeScale 0前&#xff0c;开启下面的"播放动画"协程即可. IEnumerator PlayAnimation(Animation animation, string clipName, bool useTimeScale, System.Action onComplete…

C# 计算文件、字符串的MD5值

/// <summary> /// 计算字符串的MD5值 /// </summary> public static string md5(string source) {MD5CryptoServiceProvider md5 new MD5CryptoServiceProvider();byte[] data System.Text.Encoding.UTF8.GetBytes(source);byte[] md5Data md5.ComputeHash(dat…

Unity ParticleSystem 控制粒子移动到一个点,沿路径移动.

一、粒子移动到一个点. 方案1&#xff1a;粒子系统模拟空间为Local. private Transform m_Transform;private ParticleSystem m_ParticleSystem;private ParticleSystem.Particle[] m_particles;public Transform target_Trans; //目标位置.(手动拖拽)private Vector3 pos; …

Unity 贝塞尔曲线(Beizer curve)的原理与运用

前言&#xff1a;现在使用各种搜索引擎 搜索贝塞尔曲线&#xff0c;都会有很多介绍。这里自己写一篇博客&#xff0c;只是记录一下自己的学习过程与运用方法&#xff0c;方便后续回忆。 贝塞尔曲线原理 1、一阶贝塞尔曲线&#xff1a; 一阶贝塞尔曲线&#xff0c;其实就是找一…

IEnumerator、IEnumerable的理解

请直接看以下代码&#xff0c;用foreach来了解Ienumerator和IEnumerable的原理。 class Program{static void Main(string[] args){//1.int[] array_Int;array_Int new int[] { 1, 3, 2 };foreach (int item in array_Int){Console.WriteLine(item);}//2.int[] array_Int2;arr…

Unity 限制物体旋转角度的坑

按我的理解&#xff0c;在Unity中&#xff0c;角度在内部应该是用四元数表示的&#xff0c;所以&#xff0c;在Inspector面板展示的和实际打印出来的localEulerAngles值是不一样的。 直接上代码. /// <summary>/// 旋转值 数值规范.(-180——0——180)/// </summary&…