2023年4月21日-关于远程feign调用实现文件上传下载

一、客户需求:做一个查询程序,客户提供一个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<UserEntity> 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

原文链接:https://www.cnblogs.com/public-communion/p/17338082.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:2023年4月21日-关于远程feign调用实现文件上传下载 - Python技术站

(0)
上一篇 2023年4月22日
下一篇 2023年4月22日

相关文章

  • JavaWeb中导出excel文件的简单方法

    下面是JavaWeb中导出Excel文件的简单方法的完整攻略。 步骤一:导入相关的依赖 在项目中导出Excel文件,需要用到POI库。因此需要在pom.xml中导入相关的依赖: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</…

    Java 2023年5月26日
    00
  • mybatis-plus批处理IService的实现示例

    首先,要了解mybatis-plus的批处理IService的实现,需要了解以下几个关键点: IService是mybatis-plus提供的对Mapper的封装,简化了常见的增删改查操作; IService提供了一些批量操作的接口,如saveBatch、updateBatchById等; 在使用批处理接口时,需要设置全局配置项mybatis-plus.gl…

    Java 2023年5月20日
    00
  • 浅谈Spring-boot事件监听

    浅谈Spring-boot事件监听 在Spring-boot应用程序中,通过定义和处理事件可以很方便地实现系统之间的解耦操作。Spring-boot框架提供了多种事件和事件监听器,我们可以使用它们来对应用程序某些事件做出响应。 Spring-boot事件监听器 Spring-boot框架提供了用于监听应用程序中一些事件的抽象类。它们都继承自Applicati…

    Java 2023年5月15日
    00
  • SpringBoot详解整合Spring Cache实现Redis缓存流程

    让我来详细讲解一下“SpringBoot详解整合Spring Cache实现Redis缓存流程”的完整攻略。 1. Spring Cache 简介 Spring Cache 是 Spring 官方提供的缓存框架,它通过提供 CacheManager 统一管理缓存和缓存操作,屏蔽了不同缓存框架的差异,使得我们只需要处理统一缓存接口即可,极大地降低了使用缓存的难…

    Java 2023年6月15日
    00
  • JAVA位运算的知识点总结

    JAVA位运算的知识点总结 什么是位运算 在计算机中,数据都是以二进制表示的。位运算就是直接对二进制的位进行操作的运算,包括位与、位或、位异或以及位移动等操作。 位运算符号 位运算符号包括: 按位与:& 按位或:| 按位异或:^ 左移运算:<< 右移运算:>> 无符号右移运算:>>> 下面对每种符号进行详细讲…

    Java 2023年5月26日
    00
  • SpringBoot切面拦截@PathVariable参数及抛出异常的全局处理方式

    下面是SpringBoot切面拦截@PathVariable参数及抛出异常的全局处理方式的攻略,本文将分为以下几个部分: 切面介绍 @PathVariable参数拦截处理 异常处理 在开始之前,建议读者具备基本的SpringBoot和AOP的知识。 1. 切面介绍 在Spring中,切面是一个独立的模块,通常被用来处理横切关注点的逻辑。它可以在程序运行期间动…

    Java 2023年5月23日
    00
  • Java处理InterruptedException异常的理论与实践

    Java处理InterruptedException异常的理论与实践 在多线程编程中,InterruptedException异常是常见的一种异常。该异常是由Thread类的interrupt()方法引发的,常用于中止线程的运行,但在线程等待、阻塞或者睡眠时会被抛出。本文将详细介绍Java处理InterruptedException异常的理论与实践。 理论 …

    Java 2023年5月27日
    00
  • 基于@JsonFormat的导包问题

    接下来我会为你详细讲解“基于@JsonFormat的导包问题”的完整攻略。 1. 理解@JsonFormat注解 在讲解导包问题之前,我们首先要理解 @JsonFormat 注解的作用。它是一个Jackson库中的注解,用于控制序列化和反序列化日期格式。可以将其应用于Java类或字段上。@JsonFormat注解有多种属性可以调整日期格式,例如可以设置 pa…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部