文件,视频,图片上传,验证图片,视频,返回服务器访问地址,SpringBoot
属性和方法最好分开,我这样只是为了方便找
package com.hi.test.utils;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author hi
* @program:
* @description:
* @date 2021-07-03 17:22:27
*/
@Data
@Component
@ConfigurationProperties(prefix = "myupload")
public class Upload {
//静态资源映射路径
private String resourceHandler = "/file";
//文件上传真实根路径 d:/up
private String uploadPath;
//图片上传文件夹 /aa
private String imgUploadPath = "/images";
//视频上传文件夹 /bb
private String videoUploadPath = "/videos";
//图片格式
private static Set<String> imageType = new HashSet<>();
static {
//默认图片格式
imageType.add(".png");
imageType.add(".jpg");
imageType.add(".gif");
}
//视频格式
private static Set<String> videoType = new HashSet<>();
static {
//默认视频格式
videoType.add(".mp4");
videoType.add(".avi");
videoType.add(".flv");
videoType.add(".rmvb");
videoType.add(".wmv");
videoType.add(".3gp");
videoType.add(".mkv");
videoType.add(".rm");
videoType.add(".asf");
videoType.add(".mpeg");
}
/**
* 上传单个文件
* @param file
* @param request
* @return 返回服务器访问地址
*/
public String uploadFile(MultipartFile file,String fileTypePath,HttpServletRequest request){
//上传路径
String path = uploadPath+fileTypePath;
//文件不为空时
if(!file.isEmpty()){
//拿到上传的文件名称
String fname = file.getOriginalFilename();
//获取上传文件的后缀名
String substring = fname.substring(fname.lastIndexOf('.'));
//获得自定义文件名
String filename = UUID.randomUUID()+substring;
File f = new File(path);
if(!f.exists()){
//不存在就创建文件夹
f.mkdirs();
}
try {
file.transferTo(new File(path,filename));
//返回访问地址
String address = ServerAddress.getServerAddress(request);
return address+resourceHandler+fileTypePath+"/"+filename;
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
/**
* 上传多个文件
* @param files
* @param request
* @return
*/
public String uploadFile(MultipartFile[] files,String fileTypePath,HttpServletRequest request){
if(files.length>0){
//上传路径
String path = uploadPath+fileTypePath;
File file = new File(path);
if(!file.exists()){
//不存在就创建文件夹
file.mkdirs();
}
List<String> list = new ArrayList<>();
for (MultipartFile multipartFile : files) {
if(!multipartFile.isEmpty()){
String fname = multipartFile.getOriginalFilename();
//获取文件后缀名
String substring = fname.substring(fname.lastIndexOf('.'));
//获得自定义文件名
String filename = UUID.randomUUID()+substring;
try {
//开始上传
multipartFile.transferTo(new File(path,filename));
//返回访问地址
String address = ServerAddress.getServerAddress(request);
list.add(address+resourceHandler+fileTypePath+"/"+filename);
} catch (IOException e) {
e.printStackTrace();
}
}
}
//把list转为字符串以,隔
String str = list.stream().collect(Collectors.joining(","));
return str;
}
return null;
}
/**
* 删除文件 传入映射地址
* @param filePath
*/
public void deleteFile(String filePath){
String[] split = filePath.split(",");
for (String s : split) {
String s1 = s.split(resourceHandler)[1];
File file = new File(uploadPath+s1);
file.delete();
}
}
/**
* 验证单个文件是否为图片后缀格式 true是 false不是
* @param file
* @return
*/
public boolean verifyImage(MultipartFile file){
String filename = file.getOriginalFilename();
//切取上传文件后缀名 并转为小写
String suffix = filename.substring(filename.lastIndexOf(".")).toLowerCase();
Set<String> type = toLowerCaseSet(imageType);
if (!type.contains(suffix)){
return false;
}
return true;
}
/**
* 验证多个文件是否为图片后缀格式 true是 false不是
* @param file
* @return
*/
public boolean verifyImage(MultipartFile[] file){
for (MultipartFile files : file) {
String filename = files.getOriginalFilename();
//切取上传文件后缀名 并转为小写
String suffix = filename.substring(filename.lastIndexOf(".")).toLowerCase();
Set<String> type = toLowerCaseSet(imageType);
//限制上传类型
if (!type.contains(suffix)){
return false;
}
}
return true;
}
/**
* 验证单个文件是否为视频后缀格式 true是 false不是
* @param file
* @return
*/
public boolean verifyVideo(MultipartFile file){
String filename = file.getOriginalFilename();
//切取上传文件后缀名 并转为小写
String suffix = filename.substring(filename.lastIndexOf(".")).toLowerCase();
System.out.println(suffix);
Set<String> type = toLowerCaseSet(videoType);
System.out.println(type);
//限制上传类型
if(!type.contains(suffix)){
return false;
}
return true;
}
/**
* 验证多个文件是否为视频后缀格式 true是 false不是
* @param file
* @return
*/
public boolean verifyVideo(MultipartFile[] file){
for (MultipartFile files : file) {
String filename = files.getOriginalFilename();
//切取上传文件后缀名 并转为小写
String suffix = filename.substring(filename.lastIndexOf(".")).toLowerCase();
Set<String> type = toLowerCaseSet(videoType);
//限制上传类型
if(!type.contains(suffix)){
return false;
}
}
return true;
}
/**
* 把set字符串集合转为小写
* @param set
* @return
*/
public static Set<String> toLowerCaseSet(Set<String> set){
Set<String> set1 = new HashSet<>();
for (String s : set) {
String s1 = s.toLowerCase();
set1.add(s1);
}
return set1;
}
public Set<String> getImageType() {
return imageType;
}
public void setImageType(Set<String> imageType) {
Upload.imageType = imageType;
}
public Set<String> getVideoType() {
return videoType;
}
public void setVideoType(Set<String> videoType) {
Upload.videoType = videoType;
}
}
package com.hi.test.utils;
import javax.servlet.http.HttpServletRequest;
/**
* @author hi
* @program:
* @description: 获取服务器访问地址
* @date 2021-05-30 14:56:23
*/
public class ServerAddress {
public static String getServerAddress(HttpServletRequest request){
//可以返回当前页面使用的协议,http 或是 https;
String scheme = request.getScheme();
//可以返回当前页面所在的服务器的名字;
String serverName = request.getServerName();
//可以返回当前页面所在的服务器使用的端口,就是8080;
int serverPort = request.getServerPort();
String path = scheme+"://"+serverName+":"+serverPort;
return path;
}
}
package com.hi.test.config;
import com.hi.utils.Upload;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @author hi
* @program:
* @description:
* @date 2021-07-02 10:40:20
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private Upload upload;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler(upload.getResourceHandler()+"/**")
.addResourceLocations("file:"+upload.getUploadPath());
}
}
yml配置
myupload:
upload-path: d:/up/ #必须配置 例: d:/aa/bb/
#img-upload-path: /img/aa/bb #默认 /images
#video-upload-path: /video/aa/bb #默认 /videos
#resource-handler: /hhy #默认 /file
image-type:
- .jpg
- .gif
- .png
video-type:
- .mp4