目录
一、阿里云 OSS上传
OSS相关概念
阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。OSS可用于图片、音视频、日志等海量文件的存储。各种终端设备、Web网站程序、移动应用可以直接向OSS写入或读取数据
- Endpoint:访问域名,通过该域名可以访问OSS服务的API,进行文件上传、下载等操作。
- Bucket:存储空间,是存储对象的容器,所有存储对象都必须隶属于某个存储空间。
- Object:对象,对象是 OSS 存储数据的基本单元,也被称为 OSS 的文件。
- AccessKey:访问密钥,指的是访问身份验证中用到的 AccessKeyId 和 AccessKeySecret
准备工作
首先我们需要在阿里云注册账号,实名认证后开通OSS功能,
点击进入OSS功能的管理平台,开通一个bucket
点击访问控制用于获取新增accesskeyid
创建用户
点开创建的用户,生成AccessKey
保存好自己生成的秘钥 后面登录时会用到
此后需要给我们当前的用户授权,不然无法正常进行文件上传读写
点击用户,选择刚刚新增的用户,添加权限,可以授权全部阿里云权限,或授权oss
下载安装可视化软件
登录:输入刚刚保存的key与keyecrets,选择合适的地址。即可登录成功
此页面即为登录成功页面,可以选择本地上传,也可以利用代码上传
Java代码上传
导入所需依赖
<!--阿里云OSS-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
新增yml配置文件
aliyun:
oss:
file:
# 一般不用改,选择自己的地域即可,创建时看得到
endPoint: "http://oss-cn-beijing.aliyuncs.com"
keyid: "保存的key"
keyecrets: "保存的secret"
#bucket可以在控制台创建,也可以使用java代码创建
bucketname: "实例名称"
创建一个工具类将配置文件的信息读取出来
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class ConstantPropertiesUtils implements InitializingBean {
// 读取配置文件中的内容
@Value("${aliyun.oss.file.endPoint}")
private String endpoint;
@Value("${aliyun.oss.file.keyid}")
private String keyId;
@Value("${aliyun.oss.file.keyecrets}")
private String keySecret;
@Value("${aliyun.oss.file.bucketname}")
private String bucketName;
// 在spring生命周期中 实例化->生成对象->属性填充后会进行afterPropertiesSet方法
public static String END_POINT;
public static String KEY_ID;
public static String KEY_SECRET;
public static String BUCKET_NAME;
@Override
public void afterPropertiesSet() throws Exception {
END_POINT = endpoint;
KEY_ID = keyId;
KEY_SECRET = keySecret;
BUCKET_NAME = bucketName;
}
}
service层代码
@Service
public class FileServiceImpl implements FileService {
// 最大图片大小 2M
private final long maxFileSize = 2 * 1024 * 1024;
/**
* 上传头像到OSS
*/
@Override
public String uploadFileAvatar(MultipartFile file) {
// 工具类获取值
String endpoint = FileAliOssUtils.END_POINT;
String accessKeyId = FileAliOssUtils.KEY_ID;
String accessKeySecret = FileAliOssUtils.KEY_SECRET;
String bucketName = FileAliOssUtils.BUCKET_NAME;
InputStream inputStream = null;
try {
// 创建OSS实例
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 判断文件大小
long fileSize = file.getSize();
if (fileSize > maxFileSize) {
throw new BusinessException(ErrorCode.FORBIDDEN, "文件不能大于2M");
}
// 把文件按照日期分类,获取当前日期
String datePath = new DateTime().toString("yyyy-MM");
// 获取上传文件的输入流
inputStream = file.getInputStream();
// 获取文件名称
String originalFileName = file.getOriginalFilename();
// 拼接日期和文件路径
String fileName = datePath + "/" + originalFileName;
// 判断文件是否存在
boolean exists = ossClient.doesObjectExist(bucketName, fileName);
if (exists) {
// 如果文件已存在,则先删除原来的文件再进行覆盖
ossClient.deleteObject(bucketName, fileName);
}
// 创建上传Object的Metadata
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(inputStream.available());
objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));
objectMetadata.setContentDisposition("attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
// 调用oss实例中的方法实现上传
// 参数1: Bucket名称
// 参数2: 上传到oss文件路径和文件名称 /aa/bb/1.jpg
// 参数3: 上传文件的输入流
ossClient.putObject(bucketName, fileName, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
// 把上传后文件路径返回,需要把上传到阿里云oss路径手动拼接出来
String url = "https://" + bucketName + "." + endpoint + "/" + fileName;
return url;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
/**
* Description: 判断OSS服务文件上传时文件的contentType
*
* @param filenameExtension 文件后缀
* @return String
*/
public static String getcontentType(String filenameExtension) {
if ("bmp".equalsIgnoreCase(filenameExtension)) {
return "image/bmp";
}
if ("gif".equalsIgnoreCase(filenameExtension)) {
return "image/gif";
}
if ("jpeg".equalsIgnoreCase(filenameExtension) || filenameExtension.equalsIgnoreCase("jpg")
|| "png".equalsIgnoreCase(filenameExtension)) {
return "image/jpeg";
}
if ("html".equalsIgnoreCase(filenameExtension)) {
return "text/html";
}
if ("txt".equalsIgnoreCase(filenameExtension)) {
return "text/plain";
}
if ("vsd".equalsIgnoreCase(filenameExtension)) {
return "application/vnd.visio";
}
if ("pptx".equalsIgnoreCase(filenameExtension) || filenameExtension.equalsIgnoreCase("ppt")) {
return "application/vnd.ms-powerpoint";
}
if ("docx".equalsIgnoreCase(filenameExtension) || filenameExtension.equalsIgnoreCase("doc")) {
return "application/msword";
}
if ("xml".equalsIgnoreCase(filenameExtension)) {
return "text/xml";
}
return "application/octet-stream";
}
}
控制层代码
/**
* 上传
*
* @param file 文件
* @param request 请求
* @return {@link BaseResponse}<{@link String}>
*/
@PostMapping("/upload")
@ApiOperation(value = "文件上传")
@ApiImplicitParams(
{@ApiImplicitParam(name = "file", value = "文件"),
@ApiImplicitParam(name = "request", value = "request请求")})
public BaseResponse<String> upload(MultipartFile file, HttpServletRequest request) {
if (file == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "请上传文件");
}
User loginUser = userService.getLoginUser(request);
if (loginUser == null) {
throw new BusinessException(ErrorCode.NOT_LOGIN, "请登录");
}
// 上传到阿里云对象存储
String fileUrl = ossService.uploadFileAvatar(file);
User user = new User();
user.setId(loginUser.getId());
user.setAvatarUrl(fileUrl);
boolean success = userService.updateById(user);
if (!success) {
throw new BusinessException(ErrorCode.SYSTEM_ERROR, "头像上传失败");
}
return ResultUtils.success(fileUrl);
}
接下来就可以测试使用了,不过要注意的是,文件浏览有权限,想在网页访问要打开可读权限
同时我们发现这里文件打开链接后都是下载,对于头像如何预览呢
其实点开一个头像文件可以看到阿里云官方给的提示有解决方案,这里我选择绑定域名访问
二、本地上传
这块就简单多了,我们利用一个文件上传工具类几行代码就可完成
导入依赖
<!-- 文件上传工具类 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!--hutool-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.17</version>
</dependency>
Java代码
@PostMapping("/image")
public void uploadImage(@RequestParam(value = "file", required = false) MultipartFile file, HttpServletRequest request) throws IOException {
//1.获取上传文件名字
String fileName = file.getOriginalFilename();
//2.通过上传文件名字截图后缀名
String fileNameLast = fileName.substring(fileName.indexOf("."));
//3.定义新的文件名字
String newFileName = UUID.randomUUID().toString() + fileNameLast;
//4.获取上传图片路径
String path = "D:/idea java所有实验/项目后端/user_center/src/main/resources/static/image/";
File uploadPath = new File(path + newFileName);
//5.如果上传目录不存在,创建目录
if (!uploadPath.exists()) {
uploadPath.mkdirs();
}
//6.上传文件
file.transferTo(uploadPath);
System.out.println(path+newFileName);
//7.更新 用户头像
User currentUser = userService.getCurrentUser(request);
currentUser.setAvatarUrl(path+newFileName);
userService.updateById(currentUser);
}