阿里云OSS
首先进入管理控制台OSS,然后点击 Bucket 管理界面中的创建 Bucket 按钮,会出现下面的界面:
填写信息,下面列出了几个关建的选择类型,其他默认,填写完成之后点击确定:
点击文件管理->上传文件,右侧就会弹出提示框,然后将文件拖拽进入就可以上传
上传之后,会出现下面的内容。点击图片名称就可以看到图片的访问地址,从而尽心进行访问
在OSS管理界面,点击右侧的 常用入口->Access Key,进入然后在弹窗上点击继续使用Access Key。就进入了AS管理界面
点击右侧 创建AccessKey 按钮,在弹窗中输入手机号验证码,就可以创建成功。成功之后,点击保存就会以csv格式将ID和密钥下载到本地。
OSS Java集成文档
1)引入依赖
<dependency>
<groupId>com.aliyun.ossgroupId>
<artifactId>aliyun-sdk-ossartifactId>
<version>3.8.0version>
dependency>
2)上传文件示例代码
以下代码用于上传文件至OSS:
// Endpoint以杭州为例,其它Region请按实际情况填写。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
String accessKeyId = "" ;
String accessKeySecret = "" ;
String bucketName = "" ;
// 上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
String objectName = "" ;
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 上传内容到指定的存储空间(bucketName)并保存为指定的文件名称(objectName)。
String content = "Hello OSS";
ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
// 关闭OSSClient。
ossClient.shutdown();
3)下载文件示例代码
// Endpoint以杭州为例,其它Region请按实际情况填写。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
String accessKeyId = "" ;
String accessKeySecret = "" ;
String bucketName = "" ;
// 从OSS下载文件时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
String objectName = "" ;
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 调用ossClient.getObject返回一个OSSObject实例,该实例包含文件内容及文件元信息。
OSSObject ossObject = ossClient.getObject(bucketName, objectName);
// 调用ossObject.getObjectContent获取文件输入流,可读取此输入流获取其内容。
InputStream content = ossObject.getObjectContent();
if (content != null) {
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
while (true) {
String line = reader.readLine();
if (line == null) break;
System.out.println("\n" + line);
}
// 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
content.close();
}
// 关闭OSSClient。
ossClient.shutdown();
service-oss上级模块service已经引入service的公共依赖,所以service-oss模块只需引入阿里云oss相关依赖即可
service父模块已经引入了service-base模块,所以Swagger相关默认已经引入
<dependencies>
<dependency>
<groupId>com.aliyun.ossgroupId>
<artifactId>aliyun-sdk-ossartifactId>
dependency>
<dependency>
<groupId>joda-timegroupId>
<artifactId>joda-timeartifactId>
dependency>
dependencies>
#服务端口
server.port=8081
#服务名
spring.application.name=service-oss
#环境设置:dev、test、prod
spring.profiles.active=dev
#阿里云 OSS
#不同的服务器,地址不同
aliyun.oss.file.endpoint=your endpoint
aliyun.oss.file.keyid=your accessKeyId
aliyun.oss.file.keysecret=your accessKeySecret
#bucket可以在控制台创建,也可以使用java代码创建
aliyun.oss.file.bucketname=guli-file
创建OssApplication.java
@SpringBootApplication
@ComponentScan({"cn.hanzhuang42"})
public class OssApplication {
public static void main(String[] args) {
SpringApplication.run(OssApplication.class, args);
}
}
spring boot 会默认加载org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration这个类,而DataSourceAutoConfiguration类使用了@Configuration注解向spring注入了dataSource bean,又因为项目(oss模块)中并没有关于dataSource相关的配置信息,所以当spring创建dataSource bean时因缺少相关的信息就会报错。
解决办法:
方法1、在@SpringBootApplication注解上加上exclude,解除自动加载DataSourceAutoConfiguration(推荐)
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@ComponentScan({"cn.hanzhuang42"})
public class OssApplication {
}
方法2:在配置文件中加上数据库配置(不推荐)
设置完成之后再次启动就不会报错了。
创建包utils,并在其中创建配置类 AliOssProperties
使用@Value读取application.properties里的配置内容
用spring的 InitializingBean 的 afterPropertiesSet 来初始化配置信息,这个方法将在所有的属性被初始化后调用。
package cn.hanzhuang42.oss.utils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class AliOssProperties implements InitializingBean {
@Value("${aliyun.oss.file.endpoint}")
private String endpoint;
@Value("${aliyun.oss.file.keyid}")
private String keyId;
@Value("${aliyun.oss.file.keysecret}")
private String keySecret;
@Value("${aliyun.oss.file.bucketname}")
private String bucketName;
public static String END_POINT;
public static String ACCESS_KEY_ID;
public static String ACCESS_KEY_SECRET;
public static String BUCKET_NAME;
/**
* 属性值初始化之后,该方法会执行
* 将这些属性值赋值给静态遍历,以便直接通过类名访问
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
END_POINT = endpoint;
ACCESS_KEY_ID = keyId;
ACCESS_KEY_SECRET = keySecret;
BUCKET_NAME = bucketName;
}
}
创建Service接口:
public interface OssService {
/**
* 文件上传至阿里云
* @param file
* @return
*/
String uploadFile(MultipartFile file);
}
创建Service实现类:
package cn.hanzhuang42.oss.service.impl;
import cn.hanzhuang42.oss.service.OssService;
import cn.hanzhuang42.oss.utils.AliOssProperties;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
@Service
public class OssServiceImpl implements OssService {
@Override
public String uploadFile(MultipartFile file) {
String endpoint = AliOssProperties.END_POINT;
String accessKeyId = AliOssProperties.ACCESS_KEY_ID;
String accessKeySecret = AliOssProperties.ACCESS_KEY_SECRET;
String bucketName = AliOssProperties.BUCKET_NAME;
String url = null;
try {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 上传文件流。
InputStream inputStream = file.getInputStream();
//获取文件名称
String filename = file.getOriginalFilename();
//获取不带横杠的uuid
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
//组合成唯一的文件名
filename = uuid + filename;
//在文件前边加上日期,用于创建文件夹
String datePath = new DateTime().toString("yyyy/MM/dd");
filename = datePath + "/" +filename;
//调用oss方法实现上传
//参数:
// bucketName:桶名
// filename:文件的上传路径和名称 /abs/aes/01.jpg
// inputStream:文件输入流
ossClient.putObject(bucketName,filename, inputStream);
//关闭文件输入流
inputStream.close();
// 关闭OSSClient。
ossClient.shutdown();
//拼接阿里云oss文件路径
url = "https://" + bucketName + "." + endpoint +"/" + filename;
} catch (IOException e) {
e.printStackTrace();
}
return url;
}
}
@RestController
@RequestMapping("/eduoss/fileoss")
@CrossOrigin
public class OssController {
@Autowired
private OssService ossService;
@PostMapping("upload")
public R uploadAvatar(MultipartFile file) {
//path是Oss中文件的路径
String path = ossService.uploadFile(file);
return R.ok().data("url", path);
}
}
Swagger集成具体方法参看该系列博客第三篇
访问地址,找到相应的接口,点击上传文件进行测试:
点击执行,返回结果成功: