MultipartFile文件上传 多文件上传 接受js文件
本次带来的是MultipartFile多文件文件上传,可以在sql执行完成,没有出现异常,再将文件保存进我们的服务器,如果出现异常,文件不会上传到我们的服务器
上传图片工具类
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.math.RandomUtils;
import org.springframework.web.multipart.MultipartFile;
public class FileLoad {
public static Map load(HttpServletRequest request, HttpServletResponse response, MultipartFile[] file) {
// map 储存MultipartFile[]文件数组 File类上传路径及数组 上传路径及名称(将其保存进数据库)
Map map = new HashMap();
// 上传文件名加路径
List<String> listFilePath = new ArrayList<String>();
// File提供路径及文件名
List<File> listFile = new ArrayList<File>();
// 定义存储路径
String filePath = request.getServletContext().getRealPath("/file");
System.err.println("上传路径是:" + filePath);
// 设置文件上传大小为50MB
int fileSize = 50000000;
// 最终要保存的文件名称
String loadfileName = "";
// 文件后缀
String suffix;
// 判断文件数组是否为空
if (file != null) {
// 计算一次文件累加不饿能超过50MB
long fs = 0;
for (int i = 0; i < file.length; i++) {
fs += file[i].getSize();// 文件大小累加
}
System.out.println(fs);
// 判断文件累加不能超过50MB
if (fs < fileSize) {
for (int i = 0; i < file.length; i++) {
// 判断是否上传真文件 利用上传文件名字是否等于空字符 可能会出现假文件
if (file[i].getOriginalFilename() != "" && file[i].getOriginalFilename() != null) {
// 获取用户上传文件名
String oldfileName = file[i].getOriginalFilename();
// 使用工具类FilenameUtils 截取原始文件名的后缀
suffix = FilenameUtils.getExtensionName(oldfileName);
System.out.println("原文件名:" + oldfileName);
System.out.println("后缀:" + suffix);
// 判断文件名后缀是否等于 gif,jpg,jpeg,bmp,png
if (suffix.equals("gif") || suffix.equals("jpg") || suffix.equals("jpeg")
|| suffix.equals("bmp") || suffix.equals("png")) {
// 生成上传文件名,当前时间加随机数
String fileName = System.currentTimeMillis() + RandomUtils.nextInt(1000000) + "." + suffix;
// 要上传的路径和文件名
File targetFile = new File(filePath, fileName);
if (!targetFile.exists()) {
targetFile.mkdirs();
}
try {
// 不在这里执行文件保存
// file[i].transferTo(targetFile);
// loadfileName=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+"/kuangjia/loadImg/"+fileName;
loadfileName = filePath + File.separator + fileName;// 本地路径,上边的是服务器路径
listFile.add(targetFile);
listFilePath.add(loadfileName);
System.err.println("最后上传的路径:(保存到数据库的路径)" + loadfileName);
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("fileError", "文件上传失败");
System.err.println("文件保存异常");
}
} else {
request.setAttribute("fileError", "文件上传类型不符");
}
} else {
System.out.println("出现假文件,将假文件从内存清理掉");
file = clearFile(i, file);
}
}
} else {
request.setAttribute("fileError", "上传文件总数大于50MB");
}
}
map.put("FilePath", listFilePath);
map.put("File", listFile);
map.put("MultipartFile", file);
return map;
}
// 清理假文件
public static MultipartFile[] clearFile(int index, MultipartFile[] file) {
MultipartFile[] fileNew = new MultipartFile[file.length - 1];
for (int i = index; i < file.length; i++) {
file[i] = file[i + 1];
}
System.arraycopy(file, 0, fileNew, 0, file.length);
return fileNew;
}
}
获取文件名后缀工具类
public class FilenameUtils {
public static String getExtensionName(String filename) {
if ((filename != null) && (filename.length() > 0)) {
int dot = filename.lastIndexOf('.');
if ((dot > -1) && (dot < (filename.length() - 1))) {
return filename.substring(dot + 1);
}
}
return filename;
}
}
控制器代码:
将文件提交进去不会马上保存,可以执行完sql再进行保存
public void webupload(HttpServletRequest request, HttpServletResponse response, MultipartFile[] fileimg) {
Map map = FileLoad.load(request, response, fileimg);
List<String> listpath = (List)map.get("FilePath");
List<File> listFile = (List)map.get("File");
MultipartFile[] file = (MultipartFile[])map.get("MultipartFile");
/*
* 我假装在这里执行了sql
*/
//判断保存数据条数是否正常 如果sql执行没有问题 再将文件存储在服务器
for(int i = 0; i < listFile.size(); i++) {
try {
file[i].transferTo(listFile.get(i));
}catch (Exception e) {
System.out.println("文件保存异常");
request.setAttribute("fileError", "文件保存异常");
}
}
System.out.println("保存完毕");
}
以下是一个webupload上传demo,可以体验一下
https://download.csdn.net/download/qq_43510878/10850082