package com.app.mvc.business.controller;
import com.app.mvc.acl.util.LoginUtil;
import com.app.mvc.beans.JsonData;
import com.app.mvc.beans.JsonMapper;
import com.app.mvc.business.bo.FileUploadBo;
import com.app.mvc.business.domain.FileInfo;
import com.app.mvc.business.service.FileInfoService;
import com.app.mvc.config.GlobalConfig;
import com.app.mvc.config.GlobalConfigKey;
import com.app.mvc.exception.NotFoundException;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.util.List;
@Controller
@Slf4j
@RequestMapping("/admin/file")
public class FileController {
@Resource
private FileInfoService fileInfoService;
/**
* 文件上传
* 要求:前端上传文件的input框name属性必须为file,如果多个使用多个name="file"一起提交
*
* @param request
* @return 实际图片的地址
*/
@RequestMapping("/upload.json")
public JsonData upload(HttpServletRequest request) {
String operator = LoginUtil.getUserNameCookie();
try {
List<FileUploadBo> uploadFileList = Lists.newArrayList();
//创建一个通用的多部分解析器
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
//判断 request 是否有文件上传,即多部分请求
if (multipartResolver.isMultipart(request)) {
//转换成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
MultiValueMap<String, MultipartFile> multiValueMap = multiRequest.getMultiFileMap();
List<MultipartFile> fileList = multiValueMap.get("file");
uploadFileList = fileInfoService.handleUploadFiles(fileList, operator);
}
log.info("文件上传结果:{}", JsonMapper.obj2String(uploadFileList));
return JsonData.success(uploadFileList);
} catch (Throwable e) {
return JsonData.error("文件上传失败");
}
}
@RequestMapping("/download.do")
public void download(HttpServletRequest request, HttpServletResponse response, int id) throws Exception {
FileInfo fileInfo = fileInfoService.findById(id);
if (fileInfo == null) {
throw new NotFoundException("未查到可下载的文件");
}
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
String downloadPath = GlobalConfig.getValue(GlobalConfigKey.FILE_UPLOAD_PATH) + fileInfo.getName();
long fileLength = new File(downloadPath).length();
response.setHeader("Content-disposition", "attachment; filename=" + new String(fileInfo.getOriginName().getBytes("utf-8"), "ISO8859-1"));
response.setHeader("Content-Length", String.valueOf(fileLength));
bis = new BufferedInputStream(new FileInputStream(downloadPath));
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048];
int bytesRead;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
bis.close();
bos.close();
}
}