一、什么是阿里云存储?
阿里云对象存储OSS(Object Storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。
二、阿里云存储的特点和功能
海量存储:支持无限量的数据存储,适合各种规模的企业和个人用户。
高可用性:数据存储在多个数据中心,提供99.999999999%(11个9)的数据持久性。
安全性:提供多种安全机制,包括数据加密、访问控制和身份验证等,确保用户数据的安全。
高性能:支持大并发读写,能够快速响应用户请求。
灵活计费:根据存储空间和流量使用情况进行计费,适合不同需求的用户。
丰富的API:支持RESTful API,方便开发者集成和使用。
多种存储类型:提供标准存储、低频存储和归档存储等不同存储类型,满足不同访问频率的数据需求。
数据管理:支持生命周期管理、版本管理和数据迁移等功能,方便用户管理存储的数据。
三、springboot文件上传
1.为什么要使用阿里云OSS对象存储
在我们使用了阿里云OSS对象存储服务之后,我们的项目当中如果涉及到文件上传这样的业务,在前端进行文件上传并请求到服务端时,在服务器本地磁盘当中就不需要再来存储文件了。我们直接将接收到的文件上传到oss,由 oss帮我们存储和管理,同时阿里云的oss存储服务还保障了我们所存储内容的安全可靠。
2.进行准备工作(注册阿里云账户,并创建阿里云oss对象实例)
1.注册阿里云账户(注册完成后需要实名认证)
2.注册完账号之后,就可以登录阿里云
3.通过控制台找到对象存储OSS服务
如果是第一次访问,还需要开通对象存储服务OSS
4.开通OSS服务之后,就可以进入到阿里云对象存储的控制台
5.点击左侧的 "Bucket列表",创建一个Bucket
创建
3.编写入门程序
首先我们需要来打开阿里云OSS的官方文档,在官方文档中找到 SDK 的示例代码:
参照官方提供的SDK,改造一下,即可实现文件上传功能:
import com.aliyun.oss.ClientException;import com.aliyun.oss.OSS;import com.aliyun.oss.OSSClientBuilder;import com.aliyun.oss.OSSException;import com.aliyun.oss.model.PutObjectRequest;import com.aliyun.oss.model.PutObjectResult;import java.io.FileInputStream;import java.io.InputStream;public class AliOssTest { public static void main(String[] args) throws Exception { // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。 String endpoint = "oss-cn-shanghai.aliyuncs.com"; // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。 String accessKeyId = "LTAI5t9MZK8iq5T2Av5GLDxX"; String accessKeySecret = "C0IrHzKZGKqU8S7YQcevcotD3Zd5Tc"; // 填写Bucket名称,例如examplebucket。 String bucketName = "web-framework01"; // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。 String objectName = "1.jpg"; // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。 // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。 String filePath= "C:\\Users\\Administrator\\Pictures\\1.jpg"; // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); try { InputStream inputStream = new FileInputStream(filePath); // 创建PutObjectRequest对象。 PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream); // 设置该属性可以返回response。如果不设置,则返回的response为空。 putObjectRequest.setProcess("true"); // 创建PutObject请求。 PutObjectResult result = ossClient.putObject(putObjectRequest); // 如果上传成功,则返回200。 System.out.println(result.getResponse().getStatusCode()); } 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(); } } }}
在以上代码中,需要替换的内容为:
accessKeyId:阿里云账号AccessKey
accessKeySecret:阿里云账号AccessKey对应的秘钥
bucketName:Bucket名称
objectName:对象名称,在Bucket中存储的对象的名称
filePath:文件路径
AccessKey :
运行以上程序后,会把本地的文件上传到阿里云OSS服务器上:
4.集成代码
阿里云oss对象存储服务的准备工作以及入门程序我们都已经完成了,接下来我们就需要在案例当中集成oss对象存储服务,来存储和管理案例中上传的图片。
引入阿里云OSS上传文件工具类(由官方的示例代码改造而来)
import com.aliyun.oss.OSS;import com.aliyun.oss.OSSClientBuilder;import org.springframework.stereotype.Component;import org.springframework.web.multipart.MultipartFile;import java.io.IOException;import java.io.InputStream;import java.util.UUID;@Componentpublic class AliOSSUtils { private String endpoint = "https://oss-cn-shanghai.aliyuncs.com"; private String accessKeyId = "LTAI5t9MZK8iq5T2Av5GLDxX"; private String accessKeySecret = "C0IrHzKZGKqU8S7YQcevcotD3Zd5Tc"; private String bucketName = "web-framework01"; /** * 实现上传图片到OSS */ public String upload(MultipartFile multipartFile) throws IOException { // 获取上传的文件的输入流 InputStream inputStream = multipartFile.getInputStream(); // 避免文件覆盖 String originalFilename = multipartFile.getOriginalFilename(); String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf(".")); //上传文件到 OSS OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); ossClient.putObject(bucketName, fileName, inputStream); //文件访问路径 String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName; // 关闭ossClient ossClient.shutdown(); return url;// 把上传到oss的路径返回 }}
修改UploadController代码:
import com.itheima.pojo.Result;import com.itheima.utils.AliOSSUtils;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;import java.io.IOException;@Slf4j@RestControllerpublic class UploadController { @Autowired private AliOSSUtils aliOSSUtils; @PostMapping("/upload") public Result upload(MultipartFile image) throws IOException { //调用阿里云OSS工具类,将上传上来的文件存入阿里云 String url = aliOSSUtils.upload(image); //将图片上传完成后的url返回,用于浏览器回显展示 return Result.success(url); } }
使用postman测试:
这样就成功上传图片啦,data返回的就是图片的数据。
四、总结
在Spring Boot中实现文件上传功能需要配置项目依赖、创建控制器处理文件上传请求、设置文件大小限制、编写HTML表单供用户选择文件,并确保存储目录存在。启动应用后,可以通过访问上传表单进行测试,同时要注意文件类型检查和异常处理,以提升安全性和用户体验。