各位看官老爷,不废话直接上干货哈!!!
在resources/templates/upload.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>文件上传</title>
</head>
<body>
<h1>文件上传</h1>
<form action="/upload/file" id="uploadform" enctype="multipart/form-data" method="post">
<input name="dir" value="bbs" id="filedir">
<input name="file" type="file" multiple onchange="toupload()" accept="image/png">
</form>
<script>
function toupload(){
document.getElementById("uploadform").submit();
}
</script>
</body>
</html>
server:
port: 8777
spring:
freemarker:
suffix: .html
cache: false
profiles:
active: dev
servlet:
multipart:
enabled: true
# 是单个文件大小 默认1M
max-file-size: 5MB
# 是设置总上传的数据大小
max-request-size: 10MB
#当文件达到多少时进行磁盘写入
file-size-threshold: 20MB
# 本地临时存储配置
location: D://data//tmp
web:
resources:
static-locations: classpath:/static/
service方法:
package com.kuangstudy.service;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@Service
public class UploadService {
@Value("${file.uploadFolder}")
private String uploadFolder;
@Value("${file.staticPath}")
private String staticPath;
/**
* MultipartFile 这个对象是springMvc提供的文件上传的接受的类,
* 它的底层自动会去和HttpServletRequest request中的request.getInputStream()融合
* 从而达到文件上传的效果。也就是告诉你一个道理:
* 文件上传底层原理是:request.getInputStream()
*
* @param multipartFile
* @param dir
* @return
*/
public String uploadImg(MultipartFile multipartFile, String dir) {
try {
String realfilename = multipartFile.getOriginalFilename(); // 上传的文件:aaa.jpg
// 2:截图文件名的后缀
String imgSuffix = realfilename.substring(realfilename.lastIndexOf("."));// 拿到:.jpg
// 3:生成的唯一的文件名:能不能用中文名:不能因为统一用英文命名。
String newFileName = UUID.randomUUID().toString()+imgSuffix;// 将aaa.jpg改写成:SD23423k324-23423ms.jpg
// 4:日期目录
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
String datePath = dateFormat.format(new Date());// 日期目录:2021/10/27
// 5: 指定文件上传以后的目录
String servrepath = uploadFolder;// 这不是tomcat服务目录,别人不认识
File targetPath = new File(servrepath+dir,datePath);// 生成一个最终目录:F://tmp/avatar/2021/10/27
if(!targetPath.exists())targetPath.mkdirs(); // 如果目录不存在:F://tmp/avatar/2021/10/27 递归创建
// 6: 指定文件上传以后的服务器的完整的文件名
File targetFileName = new File(targetPath,newFileName);// 文件上传以后在服务器上最终文件名和目录是:F://tmp/avatar/2021/10/27/SD23423k324-23423ms.jpg
// 7: 文件上传到指定的目录
multipartFile.transferTo(targetFileName);//将用户选择的aaa.jpg上传到F://tmp/avatar/2021/10/27/SD23423k324-23423ms.jpg
// 可访问的路径要返回页面
// http://localhpst:8777/bbs/2021/10/27/5f61dea2-4b77-4068-8d0b-fdf415eac6df.png
String filename = dir+"/"+datePath+"/"+newFileName;
return staticPath+"/upimages/"+filename;
} catch (IOException e) {
e.printStackTrace();
return "fail";
}
}
/**
* MultipartFile 这个对象是springMvc提供的文件上传的接受的类,
* 它的底层自动会去和HttpServletRequest request中的request.getInputStream()融合
* 从而达到文件上传的效果。也就是告诉你一个道理:
* 文件上传底层原理是:request.getInputStream()
*
* @param multipartFile
* @param dir
* @return
*/
public Map<String,Object> uploadImgMap(MultipartFile multipartFile, String dir) {
try {
String realfilename = multipartFile.getOriginalFilename(); // 上传的文件:aaa.jpg
// 2:截图文件名的后缀
String imgSuffix = realfilename.substring(realfilename.lastIndexOf("."));// 拿到:.jpg
// 3:生成的唯一的文件名:能不能用中文名:不能因为统一用英文命名。
String newFileName = UUID.randomUUID().toString()+imgSuffix;// 将aaa.jpg改写成:SD23423k324-23423ms.jpg
// 4:日期目录
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
String datePath = dateFormat.format(new Date());// 日期目录:2021/10/27
// 5: 指定文件上传以后的目录
String servrepath = uploadFolder;// 这不是tomcat服务目录,别人不认识
File targetPath = new File(servrepath+dir,datePath);// 生成一个最终目录:F://tmp/avatar/2021/10/27
if(!targetPath.exists())targetPath.mkdirs(); // 如果目录不存在:F://tmp/avatar/2021/10/27 递归创建
// 6: 指定文件上传以后的服务器的完整的文件名
File targetFileName = new File(targetPath,newFileName);// 文件上传以后在服务器上最终文件名和目录是:F://tmp/avatar/2021/10/27/SD23423k324-23423ms.jpg
// 7: 文件上传到指定的目录
multipartFile.transferTo(targetFileName);//将用户选择的aaa.jpg上传到F://tmp/avatar/2021/10/27/SD23423k324-23423ms.jpg
// 可访问的路径要返回页面
// http://localhpst:8777/bbs/2021/10/27/5f61dea2-4b77-4068-8d0b-fdf415eac6df.png
String filename = dir+"/"+datePath+"/"+newFileName;
Map<String,Object> map = new HashMap<>();
map.put("url",staticPath+"/upimages/"+filename);
map.put("size",multipartFile.getSize());
map.put("ext",imgSuffix);
map.put("filename",realfilename);
map.put("rpath",dir+"/"+datePath+"/"+newFileName);
// ftp 远程服务器文件io
return map;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
注意:${file.uploadFolder}需读取yaml配置
application-dev.yml
# 本机配置
file:
staticPath: http://localhost:8777
staticPatternPath: /upimages/**
uploadFolder: D:/tmp/
application-prod.yml
# 服务器配置
file:
staticPath: https://www.xxx.com
staticPatternPath: /upimages/**
uploadFolder: /www/upload/
controller方法:
页面跳转controller:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class PageController {
@GetMapping("/upload")
public String upload(){
return "upload";
}
}
文件上传controller:
import com.kuangstudy.service.OssUploadService;
import com.kuangstudy.service.UploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
@Controller
public class UploadController {
@Autowired
private UploadService uploadService;
@Autowired
private OssUploadService ossUploadService;
/**
* 文件上传具体实现
* @param multipartFile
* @param request
* @return
*/
@PostMapping("/upload/file")
@ResponseBody
public String upload(@RequestParam("file") MultipartFile multipartFile, HttpServletRequest request){
if(multipartFile.isEmpty()){
return "文件有误!!!";
}
long size = multipartFile.getSize();
String originalFilename = multipartFile.getOriginalFilename();
String contentType = multipartFile.getContentType();//imgae/png;image/jpg;image/gif
// if(!contentType.equals("png|jpg|gif")){
// return "文件类型不正确";
// }
// 1: 获取用户指定的文件夹。问这个文件夹为什么要从页面上传递过来呢?
// 原因是:做隔离,不同业务,不同文件放在不同的目录中
String dir = request.getParameter("dir");
return uploadService.uploadImg(multipartFile,dir);
//return ossUploadService.uploadfile(multipartFile,dir);
}
/**
* 文件上传具体实现
* @param multipartFile
* @param request
* @return
*/
@PostMapping("/upload/file2")
@ResponseBody
public Map<String,Object> uploadMap(@RequestParam("file") MultipartFile multipartFile, HttpServletRequest request){
if(multipartFile.isEmpty()){
return null;
}
long size = multipartFile.getSize();
String originalFilename = multipartFile.getOriginalFilename();
String contentType = multipartFile.getContentType();//imgae/png;image/jpg;image/gif
// if(!contentType.equals("png|jpg|gif")){
// return "文件类型不正确";
// }
// 1: 获取用户指定的文件夹。问这个文件夹为什么要从页面上传递过来呢?
// 原因是:做隔离,不同业务,不同文件放在不同的目录中
String dir = request.getParameter("dir");
return uploadService.uploadImgMap(multipartFile,dir);
}
}
流程:
且可以访问
oss是阿里云下面的一块存储图片内容的服务器产品,大概1年几百块,看个人需求即可.
另外有一点需要注意,如果你不购买阿里云oss服务,图片可以存储到bucket桶中,但是读不出来
首先看下阿里云oss服务内容:
参考网址:
service.ossKeyID
service.ossSecret
service.ossEndPoint
service.ossBucketName
这些参数分别以下地方:
controller层:
import com.kuangstudy.service.OssUploadService;
import com.kuangstudy.service.UploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
@Controller
public class UploadController {
@Autowired
private UploadService uploadService;
@Autowired
private OssUploadService ossUploadService;
/**
* 文件上传具体实现
* @param multipartFile
* @param request
* @return
*/
@PostMapping("/upload/file")
@ResponseBody
public String upload(@RequestParam("file") MultipartFile multipartFile, HttpServletRequest request){
if(multipartFile.isEmpty()){
return "文件有误!!!";
}
long size = multipartFile.getSize();
String originalFilename = multipartFile.getOriginalFilename();
String contentType = multipartFile.getContentType();//imgae/png;image/jpg;image/gif
// if(!contentType.equals("png|jpg|gif")){
// return "文件类型不正确";
// }
// 1: 获取用户指定的文件夹。问这个文件夹为什么要从页面上传递过来呢?
// 原因是:做隔离,不同业务,不同文件放在不同的目录中
String dir = request.getParameter("dir");
return ossUploadService.uploadfile(multipartFile,dir);
}
}
service:
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.CannedAccessControlList;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
@Service
public class OssUploadService {
public static 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 = "你的id";
String accessKeySecret = "你的密钥";
// 填写Bucket名称,例如examplebucket。
String bucketName = "你的bucket名称";
OSS ossClient = null;
try {
// 创建OSSClient实例。
ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 2: 获取文件上传的流
InputStream inputStream = multipartFile.getInputStream();
// 3:构建日期目录
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
String datePath = dateFormat.format(new Date());// 日期目录:2021/10/27
// 4: 获取文件名
String originname = multipartFile.getOriginalFilename();
String filename = UUID.randomUUID().toString();
String suffix = originname.substring(originname.lastIndexOf("."));
String newName = filename + suffix;
String fileUrl = dir+"/"+datePath + "/" + newName;
//5:文件上传到阿里云服务器
ossClient.putObject(bucketName, fileUrl, inputStream);
return "https://" + bucketName + "." + endpoint + "/" + fileUrl;
} catch (Exception e) {
e.printStackTrace();
return "fail";
} finally {
ossClient.shutdown();
}
}
}
因篇幅问题不能全部显示,请点此查看更多更全内容