目录
一、存储本地
二、存储到阿里云
三、配置文件信息
一、存储本地
MultipartFile 常见方法:
String getOriginalFilename(); //获取原始文件名
void transferTo(File dest); //将接收的文件转存到磁盘文件中
long getSize(); //获取文件的大小,单位:字节
byte[] getBytes(); //获取文件内容的字节数组
InputStream getInputStream(); //获取接收到的文件内容的输入流
保证每次上传文件时文件名都唯一的(使用UUID获取随机文件名)
@PostMapping("/upload")public Result upload(String filename, Integer age, MultipartFile image) throws IOException {log.info("文件上传 :{},{},{} ",filename,age,image);// 文件的原始名字String oraginaFilename = image.getOriginalFilename();// 截取后缀String extneme = oraginaFilename.substring(oraginaFilename.lastIndexOf("."));// 名字用uuidString updateNmae = UUID.randomUUID().toString() + extneme;// 将文件保存到本地目录存image.transferTo(new File("D:/XXXX/" + updateNmae));return Result.success();}
二、存储到阿里云
引入阿里云OSS上传文件工具类(由官方的示例代码改造而来)
oss参考文档
package com.demo.tliaswebmanagement.utils;import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;/*** 阿里云 OSS 工具类*/
@Component
public class AliOSSUtils {@Autowiredprivate AliOSSProperties aliOSSProperties;/*** 实现上传图片到OSS*/public String upload(MultipartFile file) throws IOException {// 获取相关信息String endpoint = aliOSSProperties.getEndpoint();String accessKeyId = aliOSSProperties.getAccessKeyId();String accessKeySecret = aliOSSProperties.getAccessKeySecret();String bucketName = aliOSSProperties.getBucketName();// 获取上传的文件的输入流InputStream inputStream = file.getInputStream();// 避免文件覆盖String originalFilename = file.getOriginalFilename();String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));//上传文件到 OSSOSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);ossClient.putObject(bucketName, fileName, inputStream);//文件访问路径String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;// 关闭ossClientossClient.shutdown();return url;// 把上传到oss的路径返回}}
阿里云属性类
package com.demo.tliaswebmanagement.utils;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Data
@Component
@ConfigurationProperties("aliyun.oss")
public class AliOSSProperties {//区域private String endpoint;// 身份idprivate String accessKeyId;// 身份密钥private String accessKeySecret;// 存储空间private String bucketName ;}
关于以上的这些阿里云相关配置信息,我们是直接写死在java代码中了(硬编码),如果我们在做项目时每涉及到一个第三方技术服务,就将其参数硬编码,那么在Java程序中会存在两个问题:
-
如果这些参数发生变化了,就必须在源程序代码中改动这些参数,然后需要重新进行代码的编译,将Java代码编译成class字节码文件再重新运行程序。(比较繁琐)
-
如果我们开发的是一个真实的企业级项目, Java类可能会有很多,如果将这些参数分散的定义在各个Java类当中,我们要修改一个参数值,我们就需要在众多的Java代码当中来定位到对应的位置,再来修改参数,修改完毕之后再重新编译再运行。(参数配置过于分散,是不方便集中的管理和维护)
controller类
注入文件上传的工具类
@Autowiredprivate AliOSSUtils aliOSSUtils;@PostMapping("/upload")public Result upload(MultipartFile file) throws IOException{// 通过工具类oss工具类上传文件并获取urlString url = aliOSSUtils.upload(file);return Result.success(url);}
调试
三、配置文件信息
application.yml的配置信息
#数据库配置 spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/tliasusername: rootpassword: 123456servlet:multipart:max-file-size: 10MBmax-request-size: 100MB#mabits配置 mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true#oss存储配置 aliyun:oss:endpoint: https://oss-cn-guangzhou.aliyuncs.com # 阿里云OSS域名 accessKeyId: xxxxxxxxxxxxxxxxx # 用户身份ID accessKeySecret: xxxxxxxxxxxxxxxxxxxx # 用户密钥 bucketName: web-198 # 存储空间的名字