package com.donleo.ssm.utils;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.List;
/**
* @author liangd
* date 2020-11-24 18:25
* code 图片上传工具类
*/
public class UploadUtils {
public static String save(HttpServletRequest req, HttpServletResponse resp) {
//保存图片的路径
String savePath = CommonPath.SAVE_PATH.getValue();
//图片前面的具体路径
String imgPath = CommonPath.IMG_PATH.getValue();
//new一个file类
File file = new File(savePath, imgPath);
//判断文件夹是否存在,如果存在,是否是文件夹,否则创建文件夹
if (!file.exists() && !file.isDirectory()) {
file.mkdirs();
}
//返回地址
String fileUrl ="";
try {
//创建DiskFileItemFactory工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//创建一个文件上传解析器
ServletFileUpload upload = new ServletFileUpload(factory);
//设置编码格式
upload.setHeaderEncoding("UTF-8");
//判断提交的数据是否是表单上的数据,multpart/form-data,如果不是,返回空字符串
if (!ServletFileUpload.isMultipartContent(req)) {
}
//使用ServletFileUpload解析表单数据,返回的是List<FileItem>集合,需要进行遍历
//将上传的数据强制转换为FileItem类型
List<FileItem> list = upload.parseRequest(req);
for (FileItem item : list) {
//判断表单是否是普通类型,text,select等都是普通类型,否则该表单是file类型
if (item.isFormField()) {
String name = item.getFieldName();
String value = item.getString("UTF-8");
req.setAttribute(name, new String(value.getBytes()));
} else {
//得到当前图片文件name名
String filesName = item.getFieldName();
//得到file文件名
String fileName = item.getName();
//判断文件名是否为空
if (fileName == null || "".equals(fileName.trim())) {
continue;
}
//substring截取字符串,如果上传的文件名前面有\\,最后一个\\后面的文件名
fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
//InputStream getInputStream(),以流的形式返回上传文件的数据内容。
InputStream inputStream = item.getInputStream();
//保存到数据库的路径
String dataPath = imgPath + fileName;
//图片的具体路径(全路径)
String imgUrl = savePath + dataPath;
//返回地址
fileUrl=dataPath;
//文件输出流
FileOutputStream fileOutputStream = new FileOutputStream(imgUrl);
//创建一个为1M的缓冲区
byte buffer[] = new byte[1024];
int length = 0;
//判断流是否已经读取完毕
while ((length = inputStream.read(buffer)) > 0) {
fileOutputStream.write(buffer, 0, length);
}
//关闭输入输出流,并删除临时文件
inputStream.close();
fileOutputStream.close();
item.delete();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return fileUrl;
}
}