UploadUtil代码
package
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UploadUtil {
private static final String CMD_SELECT_FREE_SPACE = "df -P -hT";
private final static Logger LOG = LoggerFactory.getLogger(UploadUtil.class);
/**
* 查询当前路径所在磁盘的剩余空间
*
* @param path
* @return 剩余空间字节数
*/
public static double getFreeSpaceByPath(String path) {
double freeHD = 0;
BufferedReader reader = null;
try {
Runtime rt = Runtime.getRuntime();
Process p = rt.exec(CMD_SELECT_FREE_SPACE + " " + path);
reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String str = null;
String[] strArray = null;
while ((str = reader.readLine()) != null) {
int m = 0;
strArray = str.split(" ");
LOG.info("df -P -hT result:" + Arrays.toString(strArray) + ";m:" + m);
for (String tmp : strArray) {
if (tmp.trim().length() == 0)
continue;
if (tmp.indexOf("T") != -1) {
if (m == 4) {
if (!tmp.equals("none") && !tmp.equals("0"))
freeHD = Double.parseDouble(tmp.substring(0, tmp.length() - 1)) * 1024 * 1024 * 1024 * 1024;
}
}
else if (tmp.indexOf("G") != -1) {
if (m == 4) {
if (!tmp.equals("none") && !tmp.equals("0"))
freeHD = Double.parseDouble(tmp.substring(0, tmp.length() - 1)) * 1024 * 1024 * 1024;
}
}
else if (tmp.indexOf("M") != -1) {
if (m == 4) {
if (!tmp.equals("none") && !tmp.equals("0"))
freeHD = Double.parseDouble(tmp.substring(0, tmp.length() - 1)) * 1024 * 1024;
}
}
m++;
}
}
} catch (Exception e) {
LOG.error("Get disk free space error. path=" + path, e);
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
LOG.error("Close reader error.", e);
}
}
LOG.info("The path=" + path + ",and the disk have free space is " + freeHD);
return freeHD;
}
}
uploadController
package
import java.awt.image.BufferedImage;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.UUID;
import javax.imageio.ImageIO;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.lixin.secure.user.common.Constants;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import com.alibaba.druid.util.StringUtils;
@RequestMapping("upload")
@Controller
public class UploadController {
private final static Logger LOG = LoggerFactory.getLogger(UploadController.class);
/**
* 文件上传根路径,当前磁盘满时,支持自动切换到挂载的其他盘
*/
private static List rootpaths = new ArrayList();
/**
* 文件上传格式
*/
private static List fileTypes = new ArrayList();
/**
* 文件上传大小限制,单位:字节
*/
private static Long limitFileSize = 0L;
/**
* 磁盘剩余空间阈值,单位:字节
*/
private static double limitFreeSpace = 0L;
static {
Properties properties = new Properties();
FileInputStream fis = null;
try {
// 初始化文件上传参数:文件保存路径,文件格式,文件大小
fis = new FileInputStream(
StringUtils.class.getClassLoader().getResource("/").getPath() + "fileconfig.properties");
properties.load(fis);
String[] file_root_path = properties.getProperty("file_root_path").split(";");
for (String path : file_root_path) {
if (!path.endsWith(File.separator)) {
rootpaths.add(path + File.separator);
} else {
rootpaths.add(path);
}
}
String[] file_types = properties.getProperty("file_types").split(";");
for (String type : file_types) {
fileTypes.add(type);
}
limitFileSize = Long.valueOf(properties.getProperty("file_size_limit")) * 1024 * 1024;
limitFreeSpace = Double.valueOf(properties.getProperty("upload_disk_threshold")) * 1024 * 1024 * 1024;
} catch (FileNotFoundException e) {
LOG.error("the file config not found.", e);
} catch (IOException e) {
LOG.error("load file config error.", e);
} finally {
try {
if (fis != null) {
fis.close();
}
} catch (IOException e) {
LOG.error("load file config error.", e);
}
}
}
/**
* 上传文件或删除服务端文件时检测当前用户是否有权限可操作
*
* @param request
* @param response
* @param filePath
* @return
*/
@RequestMapping(value = "/checkPermission", method = { RequestMethod.POST })
@ResponseBody
public ActionResult checkPermission(@RequestParam(required = true, defaultValue = "0") Long parentId,
@RequestParam(required = true, defaultValue = "") Integer type) {
return checkAuth(parentId, type);
}
return result;
}
/**
* 检查上传文件类型
*
* @param fullFileName
* 文件全名称
* @return
*/
private boolean checkFileType(String fullFileName) {
String type = fullFileName.substring(fullFileName.lastIndexOf(".") + 1, fullFileName.length());
if (fileTypes.contains(type.toLowerCase())) {
return true;
}
LOG.error("Cannot support the file type,name=" + fullFileName);
return false;
}
/**
* 检查上传文件大小
*
* @param fileSize
* 文件字节大小
* @return
*/
private boolean checkFileSize(Long fileSize) {
if (limitFileSize < fileSize) {
LOG.error("The file is too big,size=" + fileSize);
return false;
}
return true;
}
/**
* 获取要上传的磁盘路径
*
* @return
*/
private String getUploadPath() {
if (rootpaths == null || rootpaths.isEmpty()) {
return "";
}
for (String path : rootpaths) {
if (!System.getProperty("os.name").equalsIgnoreCase("linux")) {
return path;
}
double freespace = UploadUtil.getFreeSpaceByPath(path);
if (freespace > limitFreeSpace) {
return path;
}
LOG.info("The disk free space have not enough[path=" + path + "],switch next path");
}
return "";
}
/**
* 获取已经上传的文件的路径
*
* @return
*/
private String getUploadFilePath(String relativePath) {
if (rootpaths == null || rootpaths.isEmpty()) {
return relativePath;
}
for (String path : rootpaths) {
File file = new File(path + relativePath);
if (file.exists()) {
return path + relativePath;
}
LOG.warn("The file path is not exists[filepath=" + path + relativePath + "],switch next path");
}
return "";
}
// SWFUpload单击上传以后的响应函数
@RequestMapping(value = "/upload", method = { RequestMethod.POST })
public @ResponseBody String upload(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 多文件上传的时候,封装的请求参数
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
// 获取前台传递过来的文件参数
Map fileMap = multipartRequest.getFileMap();
// 文件名的格式化——年月
String ymd = new SimpleDateFormat("yyyyMM").format(new Date()) + File.separator
+ new SimpleDateFormat("dd").format(new Date()) + File.separator;
String uploadPath = getUploadPath();
if (uploadPath == null || uploadPath.isEmpty()) {
return "nofreespace";
}
String ctxPath = uploadPath + ymd;
// 创建文件夹
File file = new File(ctxPath);
if (!file.exists()) {
file.mkdirs();
}
String fileName = null;
String path = null;
String newFileName = null;
for (Map.Entry entity : fileMap.entrySet()) {
MultipartFile mf = entity.getValue();
if (!checkFileSize(mf.getSize()) || !checkFileType(mf.getOriginalFilename())) {
return "notsupport";
}
}
for (Map.Entry entity : fileMap.entrySet()) {
MultipartFile mf = entity.getValue();
fileName = mf.getOriginalFilename();
String strEnc = fileName.substring(0, fileName.lastIndexOf('.'));// 加密字符串,返回String的密文
String uuid = UUID.randomUUID().toString().replaceAll("\\-", "");// 返回一个随机UUID。
String suffix = fileName.indexOf(".") != -1
? fileName.substring(fileName.lastIndexOf("."), fileName.length()) : null;
newFileName = strEnc + "-" + uuid + (suffix != null ? suffix : "");// 构成新文件名。
File uploadFile = new File(ctxPath + newFileName);
try {
FileCopyUtils.copy(mf.getBytes(), uploadFile);
path = ymd + File.separator + newFileName;
} catch (IOException e) {
LOG.error("upload file error.", e);
}
}
return path;
}
/**
* 验证文件类型
* @param id 文件id
* @return ActionResult statusCode为1 表示图片 否则为其他文件
*/
@RequestMapping("/validateFileType")
@ResponseBody
public ActionResult validateFileType(Long id){
ActionResult actionResult = new ActionResult();
CaseFileEntity fileRecord = uploadFileService.selectByPrimaryKey(id);
String fileType = fileRecord.getOriginalFileName().substring(fileRecord.getOriginalFileName().lastIndexOf(".") + 1, fileRecord.getOriginalFileName().length());
//判断是否为图片
if (Constants.IMG_TYPE.IMGTYPES.contains(fileType)) {
actionResult.setStatusCode(1);//1表示图片
return actionResult;
}
//其他类型
actionResult.setStatusCode(2);
return actionResult;
}
/***
* 图片预览页面
* @param request
* @param imgSrc
* @return
*/
@RequestMapping("/imgView")
public String imgView(HttpServletRequest request,Long id){
request.setAttribute("id", id);
return "upload/imgview";
}
/***
* 获取图片流
* @param id
* @return
*/
@RequestMapping("/getImgPath")
@ResponseBody
public void getImgPath(Long id,HttpServletResponse response){
CaseFileEntity fileRecord = uploadFileService.selectByPrimaryKey(id);
String fileType = fileRecord.getOriginalFileName().substring(fileRecord.getOriginalFileName().lastIndexOf(".") + 1, fileRecord.getOriginalFileName().length());
String path = getUploadFilePath(fileRecord.getFilePath() + fileRecord.getFileName());
ServletOutputStream sos =null;
FileInputStream inputStream=null;
ByteArrayInputStream is=null;
try {
sos= response.getOutputStream();
inputStream = new FileInputStream(path);
//转换为字节
byte[] bytes = IOUtils.toByteArray(inputStream);
is = new ByteArrayInputStream(bytes);
BufferedImage bufferedImage = ImageIO.read(is);
//写出图片流 图片类型为fileType
ImageIO.write(bufferedImage, fileType, sos);
} catch (Exception e) {
e.printStackTrace();
}finally {
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(inputStream!=null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(sos!=null) {
try {
sos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 从服务端下载文件
*
* @param request
* @param response
* @return
*/
@RequestMapping(value = "/download")
@ResponseBody
public void download(@RequestParam(required = true, defaultValue = "") Long id, HttpServletResponse response)
throws IOException {
InputStream in = null;
OutputStream out = null;
// 根据当前附件id查询附件信息
CaseFileEntity fileRecord = uploadFileService.selectByPrimaryKey(id);
String path = getUploadFilePath(fileRecord.getFilePath() + File.separator + fileRecord.getFileName());
File file = new File(path);
// 将下载文件名变成中文选择
String fileName = new String(fileRecord.getOriginalFileName().getBytes("UTF-8"), "iso-8859-1");// 为了解决中文名称乱码问题
response.setCharacterEncoding("UTF-8");
response.setContentType("multipart/form-data");
response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
try {
in = new FileInputStream(file);
out = response.getOutputStream();
byte[] b = new byte[2048];
int length;
while ((length = in.read(b)) > 0) {
out.write(b, 0, length);
}
out.flush();
} catch (Exception e) {
LOG.error("Download error.", e);
} finally {
if (in != null) {
try {
in.close();
} catch (Exception e) {
LOG.error("Close inputstream error.", e);
}
}
if (out != null) {
try {
out.close();
} catch (Exception e) {
LOG.error("Close outputstream error.", e);
}
}
}
}
/**
* 删除附件
*
* @param request
* @param response
* @param filePath
* @return
*/
@RequestMapping(value = "/removefile", method = { RequestMethod.POST })
@ResponseBody
public ActionResult removefile(HttpServletRequest request, HttpServletResponse response,
@RequestParam(required = false, defaultValue = "0") Long id,
@RequestParam(required = false, defaultValue = "") String filePath) {
ActionResult result = new ActionResult();
try {
if (id > 0) {
CaseFileEntity fileRecord = uploadFileService.selectByPrimaryKey(id);
uploadFileService.deleteExsistFile(id);
filePath = fileRecord.getFilePath() + File.separator + fileRecord.getFileName();
}
File file = new File(getUploadFilePath(filePath));
if (file.exists()) {
file.delete();
}
result.setMessage("删除文件成功。");
result.setStatusCode(1);
} catch (Exception e) {
result.setMessage(e.getMessage());
result.setStatusCode(ErrorCode.ERROR);
LOG.error("remove file error,file=" + filePath, e);
}
return result;
}
/**
* 根据上传文件路径和所属单据ID删除附件
*
* @param request
* @param response
* @param filePath
* @return
*/
@RequestMapping(value = "/removefileByPath", method = { RequestMethod.POST })
@ResponseBody
public ActionResult removefileByPath(HttpServletRequest request, HttpServletResponse response,
@RequestParam(required = false, defaultValue = "") Long parentId,
@RequestParam(required = false, defaultValue = "") String filePath) {
ActionResult result = new ActionResult();
try {
String[] path = filePath.split("\\" + File.separator);
uploadFileService.deleteByPathAndParentId(path, parentId);
File file = new File(getUploadFilePath(filePath));
if (file.exists()) {
file.delete();
}
result.setMessage("删除文件成功。");
result.setStatusCode(1);
} catch (Exception e) {
result.setMessage(e.getMessage());
result.setStatusCode(ErrorCode.ERROR);
LOG.error("remove file error,file=" + filePath, e);
}
return result;
}
// 根据caseId列出指定的附件信息
@RequestMapping(value = "/files.json")
@ResponseBody
public List files(@RequestParam Long caseId, @RequestParam Integer type) {
List fileNameAndPath = uploadFileService.files(caseId, type);
return fileNameAndPath;
}
// 将附件信息持久化到数据库
@RequestMapping(value = "/savefiles.json")
@ResponseBody
public ActionResult saveFiles(@RequestParam Long caseId, @RequestParam("filenamelist[]") String[] filenamelist,
@RequestParam Integer type) {
ActionResult result = new ActionResult();
try {
uploadFileService.saveUploadFile(caseId, filenamelist, type);
result.setMessage("上传文件成功。");
result.setStatusCode(1);
} catch (Exception e) {
result.setMessage(e.getMessage());
result.setStatusCode(ErrorCode.ERROR);
LOG.error("save upload file error,file=" + filenamelist, e);
}
return result;
}
}