文件上传下载接口

import com.mwkj.common.constant.CommonConstant;
import com.mwkj.common.log.LogFactory;
import com.mwkj.common.log.LoggerUtil;
import com.mwkj.common.resp.ResponseMessage;
import com.mwkj.common.resp.ResponseMessageCodeEnum;
import com.mwkj.common.util.ValidateUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.io.*;
import java.net.URLEncoder;

/**
 * 作者:
 * 日期:2018-05-17
 * 功能:文件上传下载接口
 */
@RestController
@RequestMapping("/api/file")
public class FileController {

	private static final LoggerUtil logger = LogFactory.getLogger(FileController.class);


	/**
	 * 文件上传
	 *
	 * [@param](https://my.oschina.net/u/2303379) file
	 * [@param](https://my.oschina.net/u/2303379) fileName
	 * [@return](https://my.oschina.net/u/556800)
	 */
	@RequestMapping(value = "/upload", method = RequestMethod.POST)
	public ResponseMessage upload(@RequestParam("file") MultipartFile file, @RequestParam("fileName") String fileName, HttpServletRequest request, HttpServletResponse response) {
		logger.info("FileController.upload start fileName:" + fileName);

		InputStream in = null;
		OutputStream ot = null;

		//判断文件是否为空
		if (file.isEmpty()) {
			logger.info("FileController.upload 上传文件不能为空");
			return ResponseMessage.createResponse(ResponseMessageCodeEnum.req_api_up_file_empty, null);
		}

		if (StringUtils.isBlank(fileName)) {
			//文件名
			fileName = file.getOriginalFilename();
		}
		if (StringUtils.isBlank(fileName)) {
			logger.info("FileController.upload 上传文件名不能为空");
			return ResponseMessage.createResponse(ResponseMessageCodeEnum.req_api_up_filename_empty, null);
		}
		if (StringUtils.contains(fileName, "..")) {
			logger.info("FileController.upload 只允许上传图片");
			return ResponseMessage.createResponse(ResponseMessageCodeEnum.req_api_up_file_image, null);
		}

		if (ValidateUtil.isOverSize(file.getSize() / 1000000, CommonConstant.FILEMAXSIZE)) {
			logger.info("FileController.upload 上传文件超过" + CommonConstant.FILEMAXSIZE + "M");
			return ResponseMessage.createResponse(ResponseMessageCodeEnum.req_api_up_file_max_size, null);
		}

		try {
			in = file.getInputStream();
			if (ValidateUtil.isImage(in) == false) {
				logger.info("FileController.upload 上传文件不合法");
				return ResponseMessage.createResponse(ResponseMessageCodeEnum.req_api_up_file_illeage, null);
			}
		} catch (IOException e) {
			if (in != null) {
				try {
					in.close();
				} catch (IOException ex) {
					logger.info("上传文件关闭流异常" + ex.getMessage());
				}
			}
			logger.info("FileController.upload 上传文件异常");
			return ResponseMessage.createResponse(ResponseMessageCodeEnum.req_api_up_file_error, null);
		}

		//文件目录不存在则创建
		File outFile = new File(CommonConstant.FILEPATH);
		if (!outFile.exists()) {
			outFile.mkdirs();
		}

		//文件最终的存储位置
		File dest = new File(CommonConstant.FILEPATH + fileName);

		//判断目标文件所在的目录是否存在
		if (!dest.getParentFile().exists()) {
			//如果目标文件所在的目录不存在,则创建父目录
			logger.info("FileController.upload 上传文件所处目录不存在,创建");
			//创建目录
			if (!dest.getParentFile().mkdirs()) {
				logger.info("创建上传文件所处目录失败");
				return ResponseMessage.createResponse(ResponseMessageCodeEnum.req_api_up_file_create_error, null);
			}
		}
		try {
			in = file.getInputStream();
			ot = new FileOutputStream(CommonConstant.FILEPATH + fileName);
			byte[] buffer = new byte[1024];
			int len;
			while ((-1 != (len = in.read(buffer)))) {
				ot.write(buffer, 0, len);
			}
			logger.info("上传文件成功");
			return ResponseMessage.createResponse(ResponseMessageCodeEnum.req_api_up_file_success, StringUtils.replace(request.getRequestURL().toString(), "upload", "download") + "?fileName=" + fileName);
		} catch (IOException e) {
			logger.info("FileController.upload 上传文件异常");
			return ResponseMessage.createResponse(ResponseMessageCodeEnum.req_api_up_file_error, null);
		} finally {
			//关闭各种流
			if (ot != null) {
				try {
					ot.close();
				} catch (IOException e) {
					logger.info("上传文件关闭流异常" + e.getMessage());
				}
			}
			if (in != null) {
				try {
					in.close();
				} catch (IOException e) {
					logger.info("上传文件关闭流异常" + e.getMessage());
				}
			}
			logger.info("FileController.upload end fileName:" + fileName);
		}
	}

	/**
	 * 文件下载
	 *
	 * @param fileName
	 * @param request
	 * @param response
	 * @return
	 */
	@RequestMapping("/download")
	public ResponseMessage downloadFile(@RequestParam("fileName") String fileName, HttpServletRequest request, HttpServletResponse response) {
		logger.info("FileController.downloadFile start fileName:" + fileName);
		if (StringUtils.isBlank(fileName)) {
			logger.info("FileController.downloadFile 下载文件名不能为空");
			return ResponseMessage.createResponse(ResponseMessageCodeEnum.req_api_dn_filename_empty, null);
		}
		if (StringUtils.contains(fileName, "..")) {
			logger.info("FileController.downloadFile 下载文件名不合法");
			return ResponseMessage.createResponse(ResponseMessageCodeEnum.req_api_dn_file_illeage, null);
		}

		//重置buffer
		response.resetBuffer();
		//设定编码为UTF-8
		response.setCharacterEncoding("UTF-8");
		//设置头部为下载信息
		response.setHeader("Content-type", "application/force-download;charset=UTF-8");
		try {
			response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(StringUtils.contains(fileName, "/") ? StringUtils.substringAfter(fileName, "/") : fileName, "UTF-8"));// 设置文件名
		} catch (UnsupportedEncodingException e) {
			logger.info("下载设置文件名异常" + e.getMessage());
		}


		//各种流信息
		FileInputStream fileInputStream = null;
		BufferedInputStream bufferedInputStream = null;
		OutputStream outputStream = null;

		try {
			byte[] buffer = new byte[1024];
			fileInputStream = new FileInputStream(CommonConstant.FILEPATH + fileName);
			bufferedInputStream = new BufferedInputStream(fileInputStream);
			outputStream = response.getOutputStream();
			int i = bufferedInputStream.read(buffer);
			while (i != -1) {
				outputStream.write(buffer, 0, i);
				i = bufferedInputStream.read(buffer);
			}
			logger.info("下载文件成功");
			return ResponseMessage.successResponse();
		} catch (Exception e) {
			logger.info("下载文件异常" + e.getMessage());
			return ResponseMessage.createResponse(ResponseMessageCodeEnum.req_api_dn_file_fail, null);
		} finally {
			//关闭各种流
			if (outputStream != null) {
				try {
					outputStream.close();
				} catch (IOException e) {
					logger.info("下载文件关闭流异常" + e.getMessage());
				}

			}
			if (bufferedInputStream != null) {
				try {
					bufferedInputStream.close();
				} catch (IOException e) {
					logger.info("下载文件关闭流异常" + e.getMessage());
				}
			}
			if (fileInputStream != null) {
				try {
					fileInputStream.close();
				} catch (IOException e) {
					logger.info("上传文件异常" + e.getMessage());
				}
			}
			logger.info("FileController.downloadFile end fileName:" + fileName);
		}
	}
}

猜你喜欢

转载自my.oschina.net/u/1052192/blog/1819811