springboot上传文件到OSS
前提声明,文章借鉴了https://blog.csdn.net/wonder_dog/article/details/81152307#commentsedit博客,
大神在我没有思路的时候提供了最简洁明了的教程,话不多说:写代码吧
1.首先依赖:
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>${oss.version}</version>
</dependency>
2.配置oss必备属性,这都是阿里云要求的:
他有个桶机制与存入阿里云的必备条件,带着这些条件就能进行上传
aliyun:
oss:
access-id: 你的id
access-key: 你的key
bucket: 你的buket
endpoint: 你的endpoint
dir: 设置文件存放文件夹 随便写 上传自动生成
expire: 失效时间
写完配置 你需要一个类进行接收,
这里用了idea的一个插件 lombk ,使用data注解 不写getset方法了
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties("aliyun.oss")
@Data
public class AliyunOssProperties {
private String accessId;
private String accessKey;
private String bucket;
private String endpoint;
private String dir;
private Integer maxSize = Integer.valueOf(1);
private Integer expire = Integer.valueOf(30);
private boolean secure = false;
private String roleSessionName;
public AliyunOssProperties() {
}
}
上传工具类:(这里就不讲了,主要还是关于Controller层的讲解)
Controller层:
整体思路:
1.Springmvc帮我们接受前端传递过来的文件
2.获取文件名
3.自定义文件名(这里其实就可以通过/来控制上传到OSS里的文件路径了)
4.将MultpaertFile格式转化成JAVA的File格式
5.调用OSS工具类上传,除了一些基础的必备参数,还需要File属性的文件和我们自定义的上传路径(也可以理解为我们自定义的图片格式)
6.删除在本地服务器的文件副本
/** logo文件上传*/
@PostMapping("/uploadFile")
public String uploadBlog(@RequestParam("file") MultipartFile file) {
//获取原始文件名
String filename = file.getOriginalFilename();
//判断文件是否为空
try {
File toFile = null;
if (file!=null) {
//拼接/log
StringBuilder path = new StringBuilder("log/");
//获取时间戳
Date fileDate = new Date();
StringBuilder fileName = new StringBuilder(String.valueOf(fileDate.getTime()));
//获取时间文件夹,并且与时间戳进行拼接
SimpleDateFormat dateFormatShow = new SimpleDateFormat("yyyyMMdd");
String date = (dateFormatShow.format(new Date()));
StringBuilder newName = new StringBuilder(date);
//拼接/log/时间文件夹/时间戳
path.append(newName.toString());
path.append("/");
path.append(fileName);
//获取文件后缀名
String filename3 = file.getOriginalFilename();
String extName = filename3.substring(filename3.lastIndexOf(".") );
path.append(extName);
System.out.println(path);
// 将前面拼接的路径与文件名后缀进行拼接
// 获得类似这样的结果/log/20190517/1558074106768.png
String yuming1 = path.toString();
//将springmvc的MultipartFile类型转换成File类型
//并且获取输出流将传进来的文件以流的方式写入我们新建的File类型文件
File newFile = new File(filename);
FileOutputStream os = new FileOutputStream(newFile);
os.write(file.getBytes());
//记得关流
os.close();
// file.transferTo(newFile);这是另一个方法,上面的是通过java流的方法,这个是springmvc的方法,效率更高
// 调用阿里云的工具类上传到OSS
//这个工具类只需要我们传参就好,而我们所需要的路径,就是域名+我们之前自定义的阿里云里的文件夹路径
//所以这个工具类是不会返回url的,图片的访问地址就是域名+我们之前自定义拼接的阿里云的文件夹路径
//网上还有其他工具类,封装的好,这里只是提供一种实现思路
OSSUploadUtil.uploadFile(ali_endpoint,ali_accesskey_id,ali_accesskey_secret,ali_logstorage,newFile,yuming1);
// 删除上传的文件,我们这种方法上传文件会在本地服务器留下一个文件副本,需要调用上传方法进行删除
File file1=new File(filename);
String s = file1.getAbsolutePath();
DeleteFileUtil.delete(s);
//http://你们公司跟阿里云申请的域名 拼接上我们之前自定义的文件上传路径 /log/20190517/1218209821212.jpg
//拼接域名:
StringBuilder yuming= new StringBuilder("http://阿里云发给你们公司的域名前缀/");
//再拼接你自定义的文件存储路径
yuming.append(yuming1);
//这样返回给前端的就是直接能访问的url了
return (yuming.toString());
}
return FALSE;
}
catch (Exception ex) {
ex.printStackTrace();
return FALSE;
}
}
}
删除上传图片后存在本地服务器的图片的工具类:
/**
* 删除文件和目录
*
*/
public class DeleteFileUtil {
/**
* 删除文件,可以是文件或文件夹
*
* @param fileName
* 要删除的文件名
* @return 删除成功返回true,否则返回false
*/
public static boolean delete(String fileName) {
File file = new File(fileName);
if (!file.exists()) {
System.out.println("删除文件失败:" + fileName + "不存在!");
return false;
} else {
if (file.isFile())
return deleteFile(fileName);
else
return deleteDirectory(fileName);
}
}
/**
* 删除单个文件
*
* @param fileName
* 要删除的文件的文件名
* @return 单个文件删除成功返回true,否则返回false
*/
public static boolean deleteFile(String fileName) {
File file = new File(fileName);
// 如果文件路径所对应的文件存在,并且是一个文件,则直接删除
if (file.exists() && file.isFile()) {
if (file.delete()) {
System.out.println("删除单个文件" + fileName + "成功!");
return true;
} else {
System.out.println("删除单个文件" + fileName + "失败!");
return false;
}
} else {
System.out.println("删除单个文件失败:" + fileName + "不存在!");
return false;
}
}
/**
* 删除目录及目录下的文件
*
* @param dir
* 要删除的目录的文件路径
* @return 目录删除成功返回true,否则返回false
*/
public static boolean deleteDirectory(String dir) {
// 如果dir不以文件分隔符结尾,自动添加文件分隔符
if (!dir.endsWith(File.separator))
dir = dir + File.separator;
File dirFile = new File(dir);
// 如果dir对应的文件不存在,或者不是一个目录,则退出
if ((!dirFile.exists()) || (!dirFile.isDirectory())) {
System.out.println("删除目录失败:" + dir + "不存在!");
return false;
}
boolean flag = true;
// 删除文件夹中的所有文件包括子目录
File[] files = dirFile.listFiles();
for (int i = 0; i < files.length; i++) {
// 删除子文件
if (files[i].isFile()) {
flag = DeleteFileUtil.deleteFile(files[i].getAbsolutePath());
if (!flag)
break;
}
// 删除子目录
else if (files[i].isDirectory()) {
flag = DeleteFileUtil.deleteDirectory(files[i]
.getAbsolutePath());
if (!flag)
break;
}
}
if (!flag) {
System.out.println("删除目录失败!");
return false;
}
// 删除当前目录
if (dirFile.delete()) {
System.out.println("删除目录" + dir + "成功!");
return true;
} else {
return false;
}
}
public static void main(String[] args) {
// // 删除单个文件
// String file = "c:/test/test.txt";
// DeleteFileUtil.deleteFile(file);
// System.out.println();
// 删除一个目录
String dir = "D:/home/web/upload/upload/files";
DeleteFileUtil.deleteDirectory(dir);
// System.out.println();
// // 删除文件
// dir = "c:/test/test0";
// DeleteFileUtil.delete(dir);
}
}