SpringBoot实现文件上传②
前言:为什么要使用云存储?
在之前篇章我们已经实现在本机上传与获取文件,但是我们的应用服务器带宽是有限的,如果将这些资源都存储在应用服务器上会造成网络拥堵,一旦服务挂掉这些资源全无法访问。自己搭建文件存储服务器呢成本非常高,所以采用第三方oss服务来存储我们的文件资源。这篇文章将会从0基础介绍使用阿里云oss存储与七牛云存储。
阿里云oss VS 七牛云存储
阿里云:阿里云有一套完整的体系,服务器、云存储、CDN,阿里云都有对应的套餐供你使用,但是需要收费,而且CDN与oss分开收费...
七牛云:七牛有10G的永久免费存储空间,每月10GB下载流量,对用新用户来说十分的友好。
一、对接阿里云OSS
阿里云的oss的上传与存储文件是免费的,但是使用是收费的。
01、开通oss存储服务
注册阿里云账号,控制台搜索oss然后开通服务 地址:阿里云oss服务开通,进入控制台会看到这样的面板

02、创建Bucket 文件存储桶

创建Bucket

然后就创建成功

03、下载SDK

选择JAVA SDK 进入 参考网址: JAVA SDK安装
参考网址:快速入门 上传文件
04、导入SDK依赖
com.aliyun.oss
aliyun-sdk-oss
3.10.2
05、相关参数获取




06、定义OssUploadService对接
package com.qd.service;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.CannedAccessControlList;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
/**
* 阿里云文件存储
*
* @Author: qiandu
* @Blog: https://www.cnblogs.com/qd666
* @Date: 2021/11/22 22:44
*/
@Service
public class OssUploadService {
/**
* 阿里云oss文件上传
*
* @param multipartFile
* @param dir
* @return
*/
public String uploadFile(MultipartFile multipartFile, String dir) {
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
String endpoint = "Endpoint(地域节点)";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "accessKeyId";
String accessKeySecret = "accessKeySecret";
// 填写Bucket名称,例如examplebucket。
String bucketName = "bucketName";
OSS ossClient = null;
try {
// 1:创建OSSClient实例。
ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
if (!ossClient.doesBucketExist(bucketName)) {
// 创建bucket
ossClient.createBucket(bucketName);
// 设置oss实例的访问权限:公共读
ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
}
// 2:获取文件上传流
InputStream inputStream = multipartFile.getInputStream();
// 3:构建日期目录
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
String datePath = dateFormat.format(new Date());
// 4:获取文件名
String originalFilename = multipartFile.getOriginalFilename();
// 5:修改文件名
String fileName = UUID.randomUUID().toString();
// 6:取出后缀名
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
// 7:最终文件名
String newFileName = fileName + suffix;
// 8:拼接文件路径与文件名
String fileUrl = dir + "/" + datePath + "/" + newFileName;
// 9:文件上传到阿里云服务器
ossClient.putObject(bucketName, fileUrl, inputStream);
// 10:返回最终路径
return "https://" + bucketName + "." + endpoint + "/" + fileUrl;
} catch (Exception e) {
e.printStackTrace();
return "fail";
} finally {
// 关闭OSSClient。
ossClient.shutdown();
}
}
}
测试结果

二、对接七牛云存储
官网:https://www.qiniu.com/
通过七牛云官网介绍我们可以知道其提供了多种服务,我们主要使用的是七牛云提供的对象存储服务来存储图片。
01、开通对象存储
需要先注册才能使用七牛云的服务,注意:登录成功后还需要进行实名认证才能进行相关操作。

02、新建空间

03、查看文档对接
七牛云服务文档中心 服务中心
对象存储:对象存储文档
快速入门:快速入门
04、导入七牛SDK依赖
com.qiniu
qiniu-java-sdk
7.7.0
05、相关参数获取
获取secretKey与accessKey


bucket为空间存储命名
06、定义QiNiuUploadService对接
package com.qd.service;
import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;
/**
* 七牛云存储
*
* @Author: qiandu
* @Blog: https://www.cnblogs.com/qd666
* @Date: 2021/11/23 1:12
*/
@Service
public class QiNiuUploadService {
/**
* 七牛云文件上传
*
* @param multipartFile
* @return
*/
public String uploadFile(MultipartFile multipartFile) {
// 构造一个带指定 Region 对象的配置类
Configuration cfg = new Configuration(Region.region0());
UploadManager uploadManager = new UploadManager(cfg);
// 填充凭证
String accessKey = "your access key";
String secretKey = "your secret key";
String bucket = "your bucket name";
try {
// 1:得到inputStream
InputStream inputStream = multipartFile.getInputStream();
// 2:得到上传文件的名称
String originalFilename = multipartFile.getOriginalFilename();
// 3:重命名文件
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
String newFileName = UUID.randomUUID().toString() + suffix;
// 4:开始鉴权
Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
// 5:上传文件
Response response = uploadManager.put(inputStream, newFileName, upToken, null, null);
// 6:解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
// 7:返回url
return "http://r2zfdptaq.hd-bkt.clouddn.com/" + putRet.key;
} catch (Exception ex) {
return "fail";
}
}
/**
* 删除上传的文件
*
* @param fileName
*/
public static String deleteFile(String fileName) {
// 填充凭证
String accessKey = "your access key";
String secretKey = "your secret key";
String bucket = "your bucket name";
// 构造一个带指定Zone对象的配置类
Configuration cfg = new Configuration(Zone.zone0());
String key = fileName;
Auth auth = Auth.create(accessKey, secretKey);
BucketManager bucketManager = new BucketManager(auth, cfg);
try {
bucketManager.delete(bucket, key);
return "success";
} catch (QiniuException ex) {
return "fail";
}
}
}
测试结果

ok~完结 这些代码可以再次封装成工具类的,这里不再展示。