springCloud项目通过FeignClient调用上传下载文件 单文件 多文件上传

1.服务提供者:

package net.longjin.file.controller;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.coobird.thumbnailator.Thumbnails;
import net.longjin.comm.log.SysOpLog;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;

import com.alibaba.fastjson.JSON;

import net.longjin.comm.utils.FileStringUtils;
import net.longjin.comm.utils.Contents;
import net.longjin.comm.utils.TokenUtils;
import net.longjin.entity.entityCase.FileObject;
import net.longjin.entity.system.Results;
import net.longjin.file.service.FileService;

@RestController
@RequestMapping("/file")
public class FileController {

   private static final Logger log = LoggerFactory.getLogger(FileController.class);

   @Value("${file.fileBasePath}")
   private String fileBasePath;

   @Autowired
   private FileService fileService;

   //文件下载
   @SysOpLog(value = "下载文件")
   @RequestMapping("/downLoad/{fileId}")
   public String downloadFile( @PathVariable String fileId,@RequestHeader("token") String token)  {
      HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
      if(fileId==null||fileId.trim().equals("")){
         printInfo("fileId为空!",response);
         return null;
      }
      //获取文件名将文件保存在临时目录
      try {
         FileObject fb = fileService.getFileInfo(fileId);
         if(fb!=null) {
            String fileName = fb.getFileSaveName();
            if (fileName != null) {
               //设置文件路径
               File file = new File(fileBasePath +"/"+fb.getAnnexType()+"/"+ fb.getFilePath()+"/" + fileName);
               if (file.exists()) {
                  response.setContentType("application/force-download");// 设置强制下载不打开
                  response.setContentType("multipart/form-data;charset=UTF-8");//设置一下UTF-8
                  response.setHeader("Content-Disposition", "attachment;fileName=" + new String(fb.getFileName().getBytes("utf-8"), "ISO-8859-1"));
                  byte[] buffer = new byte[1024];
                  FileInputStream fis = null;
                  BufferedInputStream bis = null;
                  try {
                     fis = new FileInputStream(file);
                     bis = new BufferedInputStream(fis);
                     OutputStream os = response.getOutputStream();
                     int i = bis.read(buffer);
                     while (i != -1) {
                        os.write(buffer, 0, i);
                        i = bis.read(buffer);
                     }
                     log.info(fileName + "<<<<下载成功");
                  } catch (Exception e) {
                     e.printStackTrace();
                  } finally {
                     if (bis != null) {
                        try {
                           bis.close();
                        } catch (IOException e) {
                           e.printStackTrace();
                        }
                     }
                     if (fis != null) {
                        try {
                           fis.close();
                        } catch (IOException e) {
                           e.printStackTrace();
                        }
                     }
                  }
               }else{
                  printInfo("文件不存在!",response);
               }
            }else{
               printInfo("附件中心文件名称为空!",response);
            }
         }else{
            printInfo("文件没有上传!",response);
         }
      }catch (Exception e){
         e.printStackTrace();
      }
      return null;
   }

   //文件在线打开
   @RequestMapping("/open/{fileId}")
   public void openFile(@PathVariable String fileId)  {
      HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
      if(fileId==null||fileId.trim().equals("")){
         printInfo("fileId为空",response);
      }else {
         //获取文件文件保存目录
         FileObject fb = fileService.getFileInfo(fileId);
         try {
            if (fb != null) {
               File file = new File(fileBasePath + "/" +fb.getAnnexType()+"/"+ fb.getFilePath() + "/" + fb.getFileSaveName());
               String fileName = fb.getFileName();
               if (fileName != null) {
                  //设置文件路径
                  if (file.exists()) {
                     FileInputStream fis = new FileInputStream(file);
                     BufferedInputStream bis = new BufferedInputStream(fis);
                     OutputStream os = response.getOutputStream();
                     try {
                        if (fb.getFileType().equals("png")) {
                           response.setContentType("image/png");
                        } else if (fb.getFileType().equals("jpg")) {
                           response.setContentType("image/jpeg");
                        } else if (fb.getFileType().equals("bmp")) {
                           response.setContentType("image/bmp");
                        } else if (fb.getFileType().equals("pdf")) {
                           response.setContentType("application/pdf");
                        }
                        os = response.getOutputStream(); //创建输出流
                        byte[] b = new byte[1024];
                        while (fis.read(b) != -1) {
                           os.write(b);
                        }
                        os.flush();
                     } catch (Exception e) {
                        e.printStackTrace();
                     } finally {
                        if (bis != null) {
                           try {
                              bis.close();
                           } catch (IOException e) {
                              e.printStackTrace();
                           }
                        }
                        if (os != null) {
                           try {
                              os.close();
                           } catch (IOException e) {
                              e.printStackTrace();
                           }
                        }
                        if (fis != null) {
                           try {
                              fis.close();
                           } catch (IOException e) {
                              e.printStackTrace();
                           }
                        }
                     }
                  }
               }
            } else {
               printInfo("文件不存在!", response);
            }

         } catch (Exception e) {
            e.printStackTrace();
         }
      }
   }

   /**
    * 单个文件上传
    * @param makeThumbnail 是否制作缩略图
    * @param annexType  附件所属类型
    * @return
    */
   @SysOpLog(value = "上传单个文件")
   @RequestMapping(value = "/upload/{annexType}/{makeThumbnail}")
   public Results upload(@PathVariable Integer makeThumbnail,
                    @PathVariable String annexType,
                    @RequestPart(value = "file") MultipartFile file,
                    @RequestHeader("token") String token,
                    @RequestHeader(value = "tenantId",defaultValue="v1") String tenantId) {
      Results rs = new Results();
      if(annexType==null||annexType.trim().equals("")){
         rs.setStatusCode(Contents.requestFail);
         rs.setStatusMsg("【annexType】附件类型为空!");
         return rs;
      }

      if(!Arrays.asList("caseSimpleFile","caseNormalFile","caseTemplate","personPic").contains(annexType)){
         rs.setStatusCode(Contents.requestFail);
         rs.setStatusMsg("【annexType】附件类型格式不正确!");
         return rs;
      }


      if(makeThumbnail==null){
         rs.setStatusCode(Contents.requestFail);
         rs.setStatusMsg("是否制作缩略图没有值,必须要填写");
         return rs;
      }
      if(makeThumbnail!=0&&makeThumbnail!=1){
         rs.setStatusCode(Contents.requestFail);
         rs.setStatusMsg("【makeThumbnail】是否制作缩略图值错误,1表示制作,0表示不制作");
         return rs;
      }
      String fileName = file.getOriginalFilename();
      String suffix = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
      if(!Arrays.asList("jpg","png","bmp","doc","docx","pdf").contains(suffix)){
         rs.setStatusCode(Contents.requestFail);
         rs.setStatusMsg("上传文件格式不正确!");
         return rs;
      }
      try {
         String userId = TokenUtils.validTokenUserId(token);
         String userName = TokenUtils.validTokenUserName(token);
         Long uploadTime = System.currentTimeMillis();
         //文件存放路径
         String filePath = FileStringUtils.getDateForString(System.currentTimeMillis()+"", "yyyy") //年份
               + "/" + FileStringUtils.getDateForString(System.currentTimeMillis()+"", "MM") //月份
               + "/" + FileStringUtils.getDateForString(System.currentTimeMillis()+"", "dd");
         File tmpPath = new File(fileBasePath +"/"+annexType+"/"+ filePath);
         if (!tmpPath.exists()){//若此目录不存在,则创建
            tmpPath.mkdirs();
            log.info("创建目录路径为:"+ filePath);
         }
         if (null != file) {
            log.info("保存上传文件:"+ file.getName());

            //生成文件的名称和缩略图的文件名称
            Long temp = System.nanoTime();
            String fileSaveName = temp + "." + suffix;
            String localPath = fileBasePath +"/"+annexType+"/"+ filePath +"/"+ fileSaveName;
            File dest = new File(localPath);
            file.transferTo(dest);
            String fileId = FileStringUtils.getUUID();
            //文件文件保存进file表内容
            FileObject cf = new FileObject();
            cf.setFileId(fileId);
            cf.setAnnexType(annexType);
            cf.setFileName(fileName);
            cf.setFilePath(filePath);
            cf.setFileSaveName(fileSaveName);
            cf.setFileType(suffix);
            cf.setUploadUserId(userId);
            cf.setUploadTime(uploadTime);
            cf.setUploadUserName(userName);
            cf.setTenantId(tenantId);
            fileService.saveCaseFile(cf);
            String[]  listFile = new String[1];
            if(makeThumbnail==1&&!Arrays.asList("doc","docx","pdf").contains(suffix)) {
               FileObject thumbnailFile = new FileObject();
               //缩略图信息
               String thumbnailFileId = FileStringUtils.getUUID();
               String thumbnailSaveName = temp + "_thumbnail." + suffix;
               String thumbnailFileName = getFileNameNoEx(fileName) + "_thumbnail." + suffix;
               Thumbnails.of(localPath).scale(1f).outputQuality(0.15f).toFile(fileBasePath+"/"+annexType+"/"+filePath+"/" + thumbnailSaveName);
               thumbnailFile.setFileId(thumbnailFileId);
               thumbnailFile.setAnnexType(annexType);
               thumbnailFile.setFileName(thumbnailFileName);
               thumbnailFile.setFilePath(filePath);
               thumbnailFile.setFileSaveName(thumbnailSaveName);
               thumbnailFile.setFileType(suffix);
               thumbnailFile.setUploadUserId(userId);
               thumbnailFile.setUploadTime(uploadTime);
               thumbnailFile.setUploadUserName(userName);
               thumbnailFile.setTenantId(tenantId);
               int t = fileService.saveCaseFile(thumbnailFile);
               //保存进案件关联的文书表中
               listFile[0]=fileId + "-" + thumbnailFileId;
            }else{
               listFile[0]=fileId;
            }

            rs.setStatusCode(Contents.requestSuccess);
            rs.setStatusMsg("上传文件成功");
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("fileIdList",listFile);
            rs.setResMap(map);
            rs.setTimestamp(System.currentTimeMillis());
            return rs;
         }else{
            rs.setStatusCode(Contents.requestSuccess);
            rs.setStatusMsg("没有上传文件");
            return rs;
         }
      }catch(Exception e){
         e.printStackTrace();
         rs.setStatusCode(Contents.requestFail);
         rs.setStatusMsg("上传失败");
      }
      log.info(JSON.toJSONString(rs));
      return rs;
   }


   /**
    *  多个文件上传
    * @param makeThumbnail 是否制作缩略图
    * @param annexType  附件所属类型
    * @return
    */
   @SysOpLog(value = "上传多个文件")
   @RequestMapping("/uploads/{annexType}/{makeThumbnail}")
   public Results uploads(@PathVariable Integer makeThumbnail,
                     @PathVariable String annexType,
                     @RequestHeader("token") String token,
                     @RequestHeader(value = "tenantId",defaultValue = "v1") String tenantId,
                     @RequestPart(value = "file") MultipartFile[] files) {
      Results rs = new Results();
      if(annexType==null||annexType.trim().equals("")){
         rs.setStatusCode(Contents.requestFail);
         rs.setStatusMsg("【annexType】附件类型为空!");
         return rs;
      }

      if(!Arrays.asList("caseSimpleFile","caseNormalFile","caseTemplate","personPic").contains(annexType)){
         rs.setStatusCode(Contents.requestFail);
         rs.setStatusMsg("【annexType】附件类型格式不正确!");
         return rs;
      }

      if(makeThumbnail==null){
         rs.setStatusCode(Contents.requestFail);
         rs.setStatusMsg("【makeThumbnail】是否制作缩略图没有值,必须要填写");
         return rs;
      }
      if(makeThumbnail!=0&&makeThumbnail!=1){
         rs.setStatusCode(Contents.requestFail);
         rs.setStatusMsg("【makeThumbnail】是否制作缩略图值错误,1表示制作,0表示不制作");
         return rs;
      }

      //验证上传的文件是否符合格式
      for(MultipartFile file : files){
         String fileName = file.getOriginalFilename();
         String suffix = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
         if(!Arrays.asList("jpg","png","bmp","doc","docx","pdf").contains(suffix)){
            rs.setStatusCode(Contents.requestFail);
            rs.setStatusMsg("上传文件格式不正确!");
            return rs;
         }
      }

      try {
         String userId = TokenUtils.validTokenUserId(token);
         String userName = TokenUtils.validTokenUserName(token);
         Long uploadTime = System.currentTimeMillis();
         //文件存放路径
         String filePath = FileStringUtils.getDateForString(System.currentTimeMillis()+"", "yyyy") //年份
               + "/" + FileStringUtils.getDateForString(System.currentTimeMillis()+"", "MM") //月份
               + "/" + FileStringUtils.getDateForString(System.currentTimeMillis()+"", "dd");
         File tmpPath = new File(fileBasePath +"/"+annexType+"/"+ filePath);
         if (!tmpPath.exists()){//若此目录不存在,则创建
            tmpPath.mkdirs();
            log.info("创建目录路径为:"+ filePath);
         }
         int count = 0;
         if (null != files && files.length > 0) {
            String[] listFile = new String[files.length];
            for (MultipartFile file : files) {
               log.info("保存上传文件:"+ file.getName());
               String fileName = file.getOriginalFilename();
               String suffix = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();

               //生成文件的名称和缩略图的文件名称
               Long temp = System.nanoTime();
               String fileSaveName = temp + "." + suffix;
               String localPath = fileBasePath +"/"+annexType+"/"+ filePath +"/"+ fileSaveName;
               File dest = new File(localPath);
               file.transferTo(dest);
               String fileId = FileStringUtils.getUUID();
               //文件文件保存进file表内容
               FileObject cf = new FileObject();
               cf.setFileId(fileId);
               cf.setAnnexType(annexType);
               cf.setFileName(fileName);
               cf.setFilePath(filePath);
               cf.setFileSaveName(fileSaveName);
               cf.setFileType(suffix);
               cf.setUploadUserId(userId);
               cf.setUploadTime(uploadTime);
               cf.setUploadUserName(userName);
               cf.setTenantId(tenantId);
               fileService.saveCaseFile(cf);

               if(makeThumbnail==1&&!Arrays.asList("doc","docx","pdf").contains(suffix)) {
                  FileObject thumbnailFile = new FileObject();
                  //缩略图信息
                  String thumbnailFileId = FileStringUtils.getUUID();
                  String thumbnailSaveName = temp + "_thumbnail." + suffix;
                  String thumbnailFileName = getFileNameNoEx(fileName) + "_thumbnail." + suffix;
                  Thumbnails.of(localPath).scale(1f).outputQuality(0.15f).toFile(fileBasePath+"/"+annexType+"/"+filePath+"/" + thumbnailSaveName);
                  thumbnailFile.setFileId(thumbnailFileId);
                  thumbnailFile.setAnnexType(annexType);
                  thumbnailFile.setFileName(thumbnailFileName);
                  thumbnailFile.setFilePath(filePath);
                  thumbnailFile.setFileSaveName(thumbnailSaveName);
                  thumbnailFile.setFileType(suffix);
                  thumbnailFile.setUploadUserId(userId);
                  thumbnailFile.setUploadTime(uploadTime);
                  thumbnailFile.setUploadUserName(userName);
                  thumbnailFile.setTenantId(tenantId);
                  int t = fileService.saveCaseFile(thumbnailFile);
                  //保存进案件关联的文书表中
                  listFile[count]=fileId + "-" + thumbnailFileId;
               }else{
                  listFile[count]=fileId;
               }
               count++;

            }
            rs.setStatusCode(Contents.requestSuccess);
            rs.setStatusMsg("上传文件成功"+count+"个");
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("fileIdList",listFile);
            rs.setResMap(map);
            rs.setTimestamp(System.currentTimeMillis());
            return rs;
         }else{
            rs.setStatusCode(Contents.requestSuccess);
            rs.setStatusMsg("没有上传文件");
            return rs;
         }
      }catch(Exception e){
         e.printStackTrace();
         rs.setStatusCode(Contents.requestFail);
         rs.setStatusMsg("上传失败");
      }
      log.info(JSON.toJSONString(rs));
      return rs;
   }



   public static String getFileNameNoEx(String filename) {
      if ((filename != null) && (filename.length() > 0)) {
         int dot = filename.lastIndexOf('.');
         if ((dot >-1) && (dot < (filename.length()))) {
            return filename.substring(0, dot);
         }
      }
      return filename;
   }

   /**
    * 专门用来删除文件的请求
    * 暂时不支持PC删除
    * 后期需要调整删除方法支持各种请求来源
    * @param fileIds  多个ID用中划线连接
    * @return
    */
   @SysOpLog(value = "删除文件")
   @RequestMapping("/deleteFile/{fileIds}")
   public Results deleteAppFile(@PathVariable String fileIds,@RequestHeader("token") String token)  {
      Results rs = new Results();
      if(fileIds==null||fileIds.equals("")){
         rs.setStatusCode(Contents.requestFail);
         rs.setStatusMsg("删除文书失败,附件ID为空!");
         return rs;
      }
      String[] file = fileIds.split("-");
      int count = 0;
      for(String f :file) {
         FileObject fb = fileService.getFileInfo(f);
         File filePath = new File(fileBasePath + "/" + fb.getFilePath() + "/" + fb.getFileSaveName());
         filePath.delete();
         fileService.deleteFileId(f);
         count++;
      }
      rs.setStatusCode(Contents.requestSuccess);
      rs.setStatusMsg("删除文书成功"+count+"个");
      log.info(JSON.toJSONString(rs));
      return rs;
   }


   /**
    * 通用返回内容流
    * @param contents
    * @param response
    */
   public void printInfo(String contents,HttpServletResponse response){
      PrintWriter writer = null;
      response.setCharacterEncoding("UTF-8");
      response.setContentType("text/html; charset=utf-8");
      try {
         writer = response.getWriter();
         writer.print(contents);
      } catch (IOException e) {
         log.info(e.getMessage());
      } finally {
         if (writer != null)
            writer.close();
      }
   }


}

2.FeignClient客户端

package net.longjin.feignClient;

import feign.Response;

import net.longjin.comm.handle.FeignMultipartSupportConfig;
import net.longjin.entity.system.Results;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;

/**
 * 描述:FileFeignClient
 *
 * @author 何志鹏
 * @ClassName:FileFeignClient
 * @create 2019-10-08 13:43
 * Version 1.0
 */
@FeignClient(name="annexCenter",path = "ac",configuration = FeignMultipartSupportConfig.class)
public interface FileFeignClient {

    /**
     * 文件下载
     * @param fileId
     * @param token
     * @return
     */
    @RequestMapping(value="/file/downLoad/{fileId}")
    public Response download(@PathVariable String fileId,@RequestHeader("token") String token) ;

    /**
     * 文件删除
     * @param fileIds
     * @param token
     * @return
     */
    @RequestMapping("/file/deleteFile/{fileIds}")
    public String  deleteAppFile(@PathVariable String fileIds, @RequestHeader("token") String token);

    /**
     * 单文件上传
     * @param makeThumbnail
     * @param annexType
     * @param file
     * @param token
     * @param tenantId
     * @return
     */
    @RequestMapping( value = "/file/upload/{annexType}/{makeThumbnail}",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public Results upload(@PathVariable Integer makeThumbnail,
                          @PathVariable String annexType,
                          @RequestPart("file") MultipartFile file,
                          @RequestHeader("token") String token,
                          @RequestHeader(value = "tenantId",defaultValue="v1") String tenantId);

    /**
     * 多文件上传
     * @param makeThumbnail
     * @param annexType
     * @param file
     * @param token
     * @param tenantId
     * @return
     */
    @RequestMapping( value = "/file/uploads/{annexType}/{makeThumbnail}",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public Results upload2(@PathVariable Integer makeThumbnail,
                         @PathVariable String annexType,
                          @RequestPart("file") MultipartFile[] file,
                         @RequestHeader("token") String token,
                         @RequestHeader(value = "tenantId",defaultValue="v1") String tenantId);
}

3.通过Feign调用进行多文件上传需要进行的配置

package net.longjin.comm.handle;

import feign.RequestTemplate;
import feign.codec.EncodeException;
import feign.codec.Encoder;
import feign.form.ContentType;
import feign.form.FormEncoder;
import feign.form.MultipartFormContentProcessor;
import feign.form.spring.SpringManyMultipartFilesWriter;
import feign.form.spring.SpringSingleMultipartFileWriter;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartFile;

import java.lang.reflect.Type;
import java.util.*;

/***
 * @Auther: chengjianliang
 * @Date: 2019/10/10
 */
@Configuration
public class FeignMultipartSupportConfig {

    @Autowired
    private ObjectFactory<HttpMessageConverters> messageConverters;

    @Bean
    public Encoder feignEncoder() {
        return new SpringMultipartEncoder(new SpringEncoder(messageConverters));
    }

    private class SpringMultipartEncoder extends FormEncoder {
        public SpringMultipartEncoder(Encoder delegate) {
            super(delegate);
            MultipartFormContentProcessor processor = (MultipartFormContentProcessor)this.getContentProcessor(ContentType.MULTIPART);
            processor.addFirstWriter(new SpringSingleMultipartFileWriter());
            processor.addFirstWriter(new SpringManyMultipartFilesWriter());
        }

        @Override
        public void encode(Object object, Type bodyType, RequestTemplate template) throws EncodeException {
            if (bodyType.equals(MultipartFile[].class)) {
                MultipartFile[] files = (MultipartFile[])((MultipartFile[])object);
                HashMap data = new HashMap(files.length, 1.0F);
                data.put(files[0].getName(),Arrays.asList(files));
                super.encode(data, MAP_STRING_WILDCARD, template);
            } else if (bodyType.equals(MultipartFile.class)) {
                MultipartFile file = (MultipartFile)object;
                Map<String, Object> data = Collections.singletonMap(file.getName(), object);
                super.encode(data, MAP_STRING_WILDCARD, template);
            } else if ((object instanceof Iterable) && ((Iterable) object).iterator().hasNext() && ((Iterable) object).iterator().next() instanceof MultipartFile) {
                Iterable<?> iterable = (Iterable)object;
                HashMap data = new HashMap();
                Iterator var13 = iterable.iterator();

                while(var13.hasNext()) {
                    Object item = var13.next();
                    MultipartFile file = (MultipartFile)item;
                    data.put(file.getName(), file);
                }

                super.encode(data, MAP_STRING_WILDCARD, template);
            } else {
                super.encode(object, bodyType, template);
            }
        }
    }
}

4.通过Feign调用下载到本地所需的工具类

package net.longjin.comm.utils;

import com.alibaba.fastjson.JSON;
import feign.Response;
import net.longjin.entity.system.Results;
import net.longjin.feignClient.FileFeignClient;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.poi.util.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import java.io.*;
import java.util.*;

@Component
public class FileAPIUtils {

    private static final Logger log = LoggerFactory.getLogger(FileAPIUtils.class);

   @Value("${file.fileTmpPath}")
   private String fileTmpPath;
   @Autowired
   private FileFeignClient fileFeignClient;

    /**
     * 下载文件到本地
     * @param fileId
     * @param token
     * @return
     */
    public String download(String fileId,String token){
        Response response = null;
        response = fileFeignClient.download(fileId, token);
        Map<String, Collection<String>> headers = response.headers();

        String[] split = headers.get("Content-Disposition").iterator().next().split(";");
        String fileName = "";
        for(String header:split){
            if(header.startsWith("fileName")){
                fileName = header.split("=")[1];
                try{
                    fileName = new String(fileName.getBytes("ISO-8859-1"));
                }catch (Exception e){
                    e.printStackTrace();
                }
                break;
            }
        }
        String substring = fileName.substring(fileName.lastIndexOf("."));
        String newFileName = "" + System.nanoTime()+substring;
        InputStream inputStream = null;
        File file = null;
        try {
            Response.Body body = response.body();
            inputStream = body.asInputStream();
            file = new File(fileTmpPath,newFileName);
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            byte[] buf = new byte[10240];
            while (true) {
                int len = inputStream.read(buf);
                if (len < 0) {
                    break;
                }
                fileOutputStream.write(buf, 0, len);
            }
            inputStream.close();
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(inputStream != null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return file.toString();
    }

    /**
     * 上传文件
     * @param makeThumbnail
     * @param annexType
     * @param path
     * @param token
     * @param tenantId
     * @return
     */
    public Results uploads(Integer makeThumbnail,String annexType,String path,String token,String tenantId) {
        File file = new File(path);
        DiskFileItem fileItem = (DiskFileItem) new DiskFileItemFactory().createItem("file",MediaType.TEXT_PLAIN_VALUE, true, file.getName());

        try (InputStream input = new FileInputStream(file); OutputStream os = fileItem.getOutputStream()) {
            IOUtils.copy(input, os);
            input.close();
            os.close();
        } catch (Exception e) {
            throw new IllegalArgumentException("Invalid file: " + e, e);
        }

        MultipartFile mfile = new CommonsMultipartFile(fileItem);
        Results upload = fileFeignClient.upload(0, annexType, mfile, token, tenantId);
       return  upload;
   }

}

5.接口调用:

package net.longjin.normalCase.controller;
import net.longjin.comm.utils.FileAPIUtils;
import net.longjin.entity.system.Results;
import net.longjin.feignClient.FileFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

/**
 * 描述:Test
 *
 * @author 何志鹏
 * @ClassName:Test
 * @create 2019-09-23 14:54
 * Version 1.0
 */
@RestController
@RequestMapping("/file")
public class Test {
@Autowired
private FileAPIUtils fileAPIUtils;
    @Autowired
    private FileFeignClient fileFeignClient;
    @Value("${file.fileTmpPath}")
    private String fileTmpPath;

    /**
     * 下载文件到本地
     * @return 
     */
    @RequestMapping(value = "/uploadDemo")
    public String upload3(){
        String upload = fileAPIUtils.download("0fc2b71624394bd4883b3b654b393a92", "eyJhbGciOiJIUzI1NiJ9.eyJzdGEiOjE1NzA3NzU2MjQ1ODYsImxvZ2luSWQiOiIwNGE3YzQ2NjVjNjU0ZjVlOTdjY2EyYWNlNWIyNTcxNSIsInVzZXJOYW1lIjoi5p2O6L2pIiwidXNlcklkIjoiMTg0YjAwNTkzMzFlNGU1N2IzNjc0ZTg0YzBhNTVlNTAiLCJsb2dpbk5hbWUiOiI4NTIyYmQ0NWY2ZWVhM2MyZTdlYzJiOTJhODRhMWIxYyJ9.649848oKmKdStd5ndXmHhHHRdHAK2SDXtdfhanGcr_Q");
        return upload;
    }


    /**
     * 单文件上传
     * @param makeThumbnail 
     * @param annexType
     * @param file
     * @param token
     * @param tenantId
     * @return
     */
    @RequestMapping(value = "/uploadDemo/{annexType}/{makeThumbnail}")
    public Results upload(@PathVariable Integer makeThumbnail,
                         @PathVariable String annexType,
                         @RequestPart("file")  MultipartFile file,
                         @RequestHeader("token") String token,
                         @RequestHeader(value = "tenantId",defaultValue="v1") String tenantId){
        System.err.println("========================111111111111111111===========================");
        Results upload = fileFeignClient.upload(makeThumbnail, annexType, file, token, tenantId);
        System.err.println("========================22222222222222222222222222===========================");
        System.err.println(upload);
        return upload;
    }


    /**
     * 多文件上传
     * @param makeThumbnail 
     * @param annexType
     * @param token
     * @param tenantId
     * @param files
     * @return
     */
    @RequestMapping(value = "/uploadDemos/{annexType}/{makeThumbnail}")
    public Results uploads(@PathVariable Integer makeThumbnail,
                          @PathVariable String annexType,
                          @RequestHeader("token") String token,
                          @RequestHeader(value = "tenantId",defaultValue = "v1") String tenantId,
                          @RequestPart(value = "file") MultipartFile[] files){

        System.err.println("========================111111111111111111===========================");


        Results results = fileFeignClient.upload2(makeThumbnail, annexType, files, token, tenantId);
        System.err.println("========================22222222222222222222222222===========================");
        System.err.println(results);
        return results;
    }
    

}
发布了99 篇原创文章 · 获赞 26 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_39643007/article/details/102515310