一、客户需求:做一个查询程序,客户提供一个excel模板,将查询结果保存到excel模板中,上传到文件服务,供客户下载使用。
二、代码实现
// 服务A,文件上传@ApiOperation("上传文件-demo")@PostMapping(value = "/uploadDemo/{busType}/{billId}")public ResBean uploadFile(@PathVariable("busType") String busType, @PathVariable("billId") String billId, @RequestParam(value = "file") MultipartFile file ) { /** ......省略上传逻辑 */ return null;}
// 服务B,feign客户端package com.xxxx.remote;import org.springframework.cloud.openfeign.FeignClient;import org.springframework.http.MediaType;import org.springframework.stereotype.Repository;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.multipart.MultipartFile;@Repository@FeignClient(name = "xxxxx")public interface FeignClient { @PostMapping(value = "/xxxx/xxxx/{busType}/{billId}" , produces = {MediaType.APPLICATION_JSON_UTF8_VALUE} , consumes = MediaType.MULTIPART_FORM_DATA_VALUE ) ResBean uploadFile(@PathVariable("busType") String busType, @PathVariable("billId") String billId, @RequestPart("file") MultipartFile file );}
// 服务B,业务层public ResBean optexcel() throws IOException { List dataList = new ArrayList(); for (int i = 0; i < 10; i++) { UserEntity userEntity = new UserEntity(); userEntity.setName("张三" + i); userEntity.setAge(20 + i); userEntity.setTime(new Date(System.currentTimeMillis() + i)); dataList.add(userEntity); } //生成excel文档 Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户","用户信息"), UserEntity.class, dataList); MultipartFile file = workbookToCommonsMultipartFile(workbook, "用户.xls"); ResBean resbean = this.FeignClient.uploadFile( "xxxxxx", "111222333", file ); return resbean; } public static MultipartFile workbookToCommonsMultipartFile(Workbook workbook, String fileName) { FileItemFactory factory = new DiskFileItemFactory(16, null); FileItem fileItem = factory.createItem("file", "text/plain", true, fileName); try { OutputStream os = fileItem.getOutputStream(); workbook.write(os); os.close(); MultipartFile multipartFile = new CommonsMultipartFile(fileItem); return multipartFile; } catch (Exception e) { e.printStackTrace(); } return null; }
总结: 坑1:不加如下注解, produces = {MediaType.APPLICATION_JSON_UTF8_VALUE} consumes = MediaType.MULTIPART_FORM_DATA_VALUE 报错信息: Current request is not a multipart request 坑2:不使用@RequestPart 报错信息:the request was rejected because no multipart boundary was found 坑3:workbookToCommonsMultipartFile中factory.createItem方法中,第一参数,要和@RequestPart注解中value值一致 不一致报错信息: Required request part 'file' is not present 坑4:上传到服务器的excel重新下载后,打开时,会提示文件损坏 这时候需要给excel做一下授信,授信成功,就可以正常打开了。 授信操作参考:https://jingyan.baidu.com/article/c85b7a64a7337d413aac9555.html