本篇将带你快速了解并使用阿里云OSS实现图片文件的上传。

一、概述

阿里云是阿里巴巴集团旗下全球领先的云计算公司,也是国内最大的云服务提供商;提供多种云产品和解决方案,覆盖计算、存储、网络、安全、数据库、大数据、人工智能等领域。

阿里云对象存储OSS (Object Storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。

二、使用OSS

1、准备工作

注册阿里云(实名认证) ->充值/试用 ->开通对象存储服务(OSS) ->创建bucket ->获取Accesskey(秘钥)

1)打开阿里云官网,找到免费试用专区,一般来说个人认证成功后都会有3个月的免费试用期

点击立即试用后跳转到如下界面,可以先不购买,直接点立即开通

继续点立即开通

成功开通后提示如下,可以去管理控制台查看

不得不说,阿里云云产品的优惠力度还是挺大的,不过我也确实用不了500G啊。算了,如果以后有需求的话再考虑吧哈哈!对于个人来说,如果只是存储一些图片文件啥的,免费试用的20G也足够用了。

开通成功后创建Bucket

Bucket: 存储空间是用户用于存储对象(Object,就是文件)的容器,所有的对象都必须隶属于某个存储空间。


输入一个没有被使用的名称

将读写权限改为公共读,其他的保持默认即可。

最后点击确定,就创建成功了。可以进入概览或Bucket列表中查看详细信息,如下

准备工作的最后一步,我们需要去获取Accesskey(秘钥)。定位到个人头像下面,点击Accesskey管理

选择继续使用

然后点击创建AccessKey,经过安全验证后即可生成,点击复制

注:AccessKey ID 和 AccessKey Secret 是访问阿里云 API 的密钥,具有该账户完全的权限,我们需要妥善保管。

2、参照官方SDK编写程序

2.1 SDK说明

SDK(Software Development Kit),即软件开发工具包,包括辅助软件开发的依赖(jar包)、代码示例等,都可以叫做SDK。

查看OSS官方文档,步骤如下

2.2 案例-图片上传

1)在SDK参考文档中找到安装。我们直接选择在Maven项目中加入依赖项,这也是官方推荐的方式。

在Maven工程中使用OSS Java SDK,只需在pom.xml中加入相应依赖即可。

在pom.xml配置文件的<dependencies>标签中加入如下内容:

1
2
3
4
5
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>

注:如果使用的是Java 9及以上的版本,则需要添加JAXB相关依赖,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>

2)在SDK参考文档中找到 对象/文件 ->上传文件 ->简单上传 ->上传文件流。如果有其他需求的话选择其他上传方式即可

3)OSS访问域名和数据中心查看链接(后续代码中的endpoint会用到):
https://www.alibabacloud.com/help/zh/oss/user-guide/regions-and-endpoints ,选择自己对应地域的节点链接即可。

比如我的地域是华北2(北京),则对应的节点endpoint为:https://oss-cn-beijing.aliyuncs.com/

4)同样参考官方文档,Java配置访问凭证 ->使用长期访问凭证,步骤如下:
4.1)首先配置环境变量,具体步骤如下

a、打开命令行,执行以下命令配置RAM用户的访问密钥(注意要改为自己的)。

1
2
set OSS_ACCESS_KEY_ID=LTAI4GDty8ab9W4Y1D****
set OSS_ACCESS_KEY_SECRET=IrVTNZNy5yQelTETg0cZML3TQn****

b、执行以下命令以使更改生效。

1
2
setx OSS_ACCESS_KEY_ID "%OSS_ACCESS_KEY_ID%"
setx OSS_ACCESS_KEY_SECRET "%OSS_ACCESS_KEY_SECRET%"

c、执行以下命令验证环境变量配置。

1
2
echo %OSS_ACCESS_KEY_ID%
echo %OSS_ACCESS_KEY_SECRET%

d、成功返回示例如下:

1
2
LTAI4GDty8ab9W4Y1D****
IrVTNZNy5yQelTETg0cZML3TQn****

环境配置好后,后面只要在代码中添加下面一行即可,表示从环境变量中获取RAM用户的访问密钥,而无需再手工传入accessKeyId和accessKeySecret了;从另一个方面来说也更加安全,防止秘钥泄露。

1
2
// 使用环境变量中获取的RAM用户的访问密钥配置访问凭证。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();

特别提醒:做完上述配置后,我们需要重启电脑才会生效。

5)编写程序,实现图片上传。

如将我桌面上的 tx.jpg(路径为C:\Users\ASUS\Desktop\tx.jpg)上传到阿里云oss中,示例代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package com.itweb;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;

import java.io.FileInputStream;
import java.io.InputStream;

public class demo {
public static void main(String[] args) throws Exception {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
// String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
String endpoint = "https://oss-cn-beijing.aliyuncs.com/";
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填写Bucket名称,例如examplebucket。
String bucketName = "itweb001";
// 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
String objectName = "tx.jpg";
// 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
// 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
String filePath= "C:\\Users\\ASUS\\Desktop\\tx.jpg";

// 以下默认,不用修改
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

try {
InputStream inputStream = new FileInputStream(filePath);
// 创建PutObjectRequest对象。
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
// 创建PutObject请求。
PutObjectResult result = ossClient.putObject(putObjectRequest);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}

6)测试运行
大功告成!返回阿里云对象存储OSS的文件列表查看,效果如下

至此,成功实现了阿里云OSS图片文件上传,当然,这只是一个小小的示例。更多复杂的上传和操作有待于根据自己的实际需求进一步去发掘和学习!