content: package com.ctg.test.file;
  
  import com.ctg.test.file.util.ResultUtil;
  import org.apache.commons.lang.exception.ExceptionUtils;
  import org.apache.tomcat.util.http.fileupload.IOUtils;
  import org.apache.tomcat.util.http.fileupload.util.Streams;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  import org.springframework.web.bind.annotation.RequestMapping;
  import org.springframework.web.bind.annotation.RequestParam;
  import org.springframework.web.bind.annotation.RestController;
  import org.springframework.web.multipart.MultipartFile;
  
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import java.io.*;
  
  /**
   * @Description: soringboot整合vue,文件上传下载
   * @Author: yanhonghai
   * @Date: 2019/4/17 0:56
   */
  //上传不要用@Controller,用@RestController
  @RestController
  @RequestMapping("/file")
  public class FileController {
      private static final Logger logger = LoggerFactory.getLogger(FileController.class);
      //在文件操作中，不用/或者\最好，推荐使用File.separator
      private final static String  fileDir="files";
      private  final static String rootPath = System.getProperty("user.home")+File.separator+fileDir+File.separator;
      @RequestMapping("/upload")
      public Object uploadFile(@RequestParam("file") MultipartFile[] multipartFiles, final HttpServletResponse response, final HttpServletRequest request){
          File fileDir = new File(rootPath);
          if (!fileDir.exists() && !fileDir.isDirectory()) {
              fileDir.mkdirs();
          }
          try {
              if (multipartFiles != null && multipartFiles.length > 0) {
                  for(int i = 0;i<multipartFiles.length;i++){
                      try {
                          //以原来的名称命名,覆盖掉旧的
                          String storagePath = rootPath+multipartFiles[i].getOriginalFilename();
                          logger.info("上传的文件：" + multipartFiles[i].getName() + "," + multipartFiles[i].getContentType() + "," + multipartFiles[i].getOriginalFilename()
                                  +"，保存的路径为：" + storagePath);
                           Streams.copy(multipartFiles[i].getInputStream(), new FileOutputStream(storagePath), true);
                          //或者下面的
                           // Path path = Paths.get(storagePath);
                          //Files.write(path,multipartFiles[i].getBytes());
                      } catch (IOException e) {
                          logger.error(ExceptionUtils.getFullStackTrace(e));
                      }
                  }
              }
  
          } catch (Exception e) {
              return ResultUtil.error(e.getMessage());
          }
          return ResultUtil.success("上传成功!");
      }
  
      /**
       * http://localhost:8080/file/download?fileName=新建文本文档.txt
       * @param fileName
       * @param response
       * @param request
       * @return
       */
      @RequestMapping("/download")
      public Object downloadFile(@RequestParam String fileName, final HttpServletResponse response, final HttpServletRequest request){
          OutputStream os = null;
          InputStream is= null;
          try {
              // 取得输出流
              os = response.getOutputStream();
              // 清空输出流
              response.reset();
              response.setContentType("application/x-download;charset=GBK");
              response.setHeader("Content-Disposition", "attachment;filename="+ new String(fileName.getBytes("utf-8"), "iso-8859-1"));
             //读取流
              File f = new File(rootPath+fileName);
              is = new FileInputStream(f);
              if (is == null) {
                  logger.error("下载附件失败，请检查文件“" + fileName + "”是否存在");
                  return ResultUtil.error("下载附件失败，请检查文件“" + fileName + "”是否存在");
              }
              //复制
              IOUtils.copy(is, response.getOutputStream());
              response.getOutputStream().flush();
          } catch (IOException e) {
              return ResultUtil.error("下载附件失败,error:"+e.getMessage());
          }
          //文件的关闭放在finally中
          finally
          {
              try {
                  if (is != null) {
                      is.close();
                  }
              } catch (IOException e) {
                  logger.error(ExceptionUtils.getFullStackTrace(e));
              }
              try {
                  if (os != null) {
                      os.close();
                  }
              } catch (IOException e) {
                  logger.error(ExceptionUtils.getFullStackTrace(e));
              }
          }
          return null;
      }
  }
  