前排声明:
本文章 整合修改自https://blog.csdn.net/hcjsjqjssm/article/details/80977735 博客
一是自己以后回顾,二希望可以帮助到使用此功能的同学,假使帮助到了你,可以点个赞,留个言,如果有不成功的 也可以留言 一起解决下
提示:
这几个地方可能会报错 你只要更换下你自己的就行
日志打印类
uuid生成工具类 你可以百度一个 换上
上传工具类的日志打印 你要换掉
现在的controller 是上传完跳到一个成功的页面,但是一般用的话 应该是返回给前台上传成功后的图片id 你可以写一个返回的类 将他返回给前台 可以改一下
现在maven pom导入oss的依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>${oss.version}</version>
</dependency>
yml配置oss对象的属性`
这里你输入aliyun 不会有提示 是你自定义的属性 写就行了
aliyun:
oss:
access-id: 你的id
access-key: 你的key
bucket: 你的buket
endpoint: 你的endpoint
dir: 设置文件存放文件夹 随便写 上传自动生成
expire: 失效时间
写完配置 你需要一个类进行接收
我这里用了idea的一个插件 lombk ,使用data注解 不写getset方法了,你可以百度一下如何使用,就在pom里加载下依赖,然后再idea插件搜索下 然后安装 。 如果没弄出来,可以不用,生成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() {
}
}
然后上传工具类
注意下面,有一个设置权限公共读,假使这个权限不设置的话,你的图片路径就是一长串字符串,要是返回前台的话 估计没法用 加上这个
后缀只是你生成图片的id加后缀名
package com.chargerlink.ost.common.utils;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.CreateBucketRequest;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.chargerlink.ost.common.annotation.ChargerlinkLog;
import com.chargerlink.ost.common.constant.AliyunOssProperties;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.File;
import java.text.SimpleDateFormat;
@ChargerlinkLog
public class AliyunOssUtils {
@Autowired
AliyunOssProperties aliyunOssProperties;
/** 上传文件*/
public String upLoad(File file){
String endpoint = aliyunOssProperties.getEndpoint();
System.out.println("获取到的Point为:"+endpoint);
String accessKeyId = aliyunOssProperties.getAccessId();
String accessKeySecret = aliyunOssProperties.getAccessKey();
String bucketName = aliyunOssProperties.getBucket();
String fileHost = aliyunOssProperties.getDir();
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
// 判断文件
if(file==null){
return null;
}
String fileUrl = "";
OSSClient client=new OSSClient(endpoint, accessKeyId, accessKeySecret);
try {
// 判断容器是否存在,不存在就创建
if (!client.doesBucketExist(bucketName)) {
client.createBucket(bucketName);
CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
client.createBucket(createBucketRequest);
}
// 设置文件路径和名称
fileUrl = fileHost + (UUIDUtils.getUuid32() + file.getName().substring(file.getName().lastIndexOf("."),file.getName().length()));
// 上传文件
PutObjectResult result = client.putObject(new PutObjectRequest(bucketName, fileUrl, file));
// 设置权限(公开读)
client.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
if (result != null) {
LoggerUtil.info("------OSS文件上传成功------" + fileUrl);
}
}catch (OSSException oe){
LoggerUtil.error(oe.getMessage());
}catch (ClientException ce){
LoggerUtil.error(ce.getErrorMessage());
}finally{
if(client!=null){
client.shutdown();
}
}
return fileUrl;
}
}
到此已经完成一半了 下面是controller 接收文件 进行文件上传,只支持带文件参数的上传,layui的那种还没有研究好,如果大家有好的也可以分享下
package com.chargerlink.ost.web.controller.upload;
import com.chargerlink.ost.common.utils.AliyunOssUtils;
import com.chargerlink.ost.common.utils.DeleteFileUtil;
import com.chargerlink.util.vo.ResponseDataVo;
import org.apache.catalina.servlet4preview.http.HttpServletRequest;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileOutputStream;
@Controller
@RequestMapping("support")
public class FileUpload1Controller {
private final org.slf4j.Logger logger = LoggerFactory.getLogger(getClass());
private static final String TO_PATH = "pic";
private static final String RETURN_PATH = "success";
@Autowired
private AliyunOssUtils aliyunOSSUtil;
@GetMapping("/toUpLoadFile")
public String toUpLoadFile(){
return TO_PATH;
}
/** 文件上传*/
@PostMapping(value = "/uploadFile")
@ResponseBody
public string uploadBlog(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
logger.info("文件上传");
String filename = file.getOriginalFilename();
System.out.println(filename);
String uploadUrl = "";
try {
if (file!=null) {
if (!"".equals(filename.trim())) {
File newFile = new File(filename);
FileOutputStream os = new FileOutputStream(newFile);
os.write(file.getBytes());
os.close();
file.transferTo(newFile);
// 上传到OSS
uploadUrl = aliyunOSSUtil.upLoad(newFile);
System.err.println(uploadUrl);
// 删除上传的文件
File file1=new File("");
String s = file1.getAbsolutePath();
DeleteFileUtil.delete(s + "\\" + filename);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return RETURN_PATH;
}
}
原来的这个是没有文件删除的,就是你上传一张图片后,咋你的项目根目录就会保存一张你上传的图片,我又找了一个删除的工具类
在上传完成后,接着把保存在本地的图片删除了代码如下
package com.chargerlink.ost.common.utils;
import java.io.File;
/**
* 删除文件和目录
*
*/
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);
}
}
最后是html页面 你可以测试使用
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" >
<head>
<meta charset="UTF-8">
<title>【基于OSS的上传文件页面】</title>
<link rel="stylesheet" th:href="@{/css/bootstrap.min.css}" media="all">
<style type="text/css">
*{
margin:0;
padding:0;
}
#group{
position: absolute;
left:580px;
}
#submit{
position: absolute;
top:140px;
left:580px;
}
</style>
</head>
<body>
<div align="center">
<h2 style="color:orangered;">基于OSS的上传文件页面</h2>
</div>
<br/>
<form action="/uploadFile" enctype="multipart/form-data" method="post">
<div class="form-group" id="group">
<label for="exampleInputFile">File input</label>
<input type="file" id="exampleInputFile" name="file">
</div>
<button type="submit" class="btn btn-default" id="submit">上传</button>
</form>
</body>
</html>
成功页面
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" >
<head>
<meta charset="UTF-8">
<title>【文件上传成功页面】</title>
</head>
<body>
<div align="center">
<h5>上传成功</h5>
<img src="images/true.jpg" />
</div>
</body>
</html>
到此 spring boot整合oss 上传图片就完成了
假使你用的不是spring boot 只是maven的话 只需要把ylm的配置 配置在实体类引用即可
代码如下
package com.chargerlink.ost.common.constant;
/**
* @class:OSSClientConstants
* @descript:阿里云注册用户基本常量
*/
public class OSSClientConstants {
//阿里云API的外网域名
public static final String ENDPOINT = "";
//阿里云API的密钥Access Key ID
public static final String ACCESS_KEY_ID = "";
//阿里云API的密钥Access Key Secret
public static final String ACCESS_KEY_SECRET = "";
//阿里云API的bucket名称
public static final String BACKET_NAME = "";
//阿里云API的文件夹名称
public static final String FOLDER="";
}