dubbo微服务架构中传递MuitipartFile的问题及解决方式

引言

今天在使用springboot+dubbo+zookeeper搭建的微服务架构项目中使用阿里云oss对象存储去集成图片上传功能时出现如下错误:

Serialized class org.apache.catalina.core.ApplicationPart must implement java.io.Serializable

根据这个错误提示可以看出是由于未序列化引发的问题,但是不知道具体问题出在哪

错误原因

经过资料查询后发现是由于dubbodubbo不能在不同服务间传递MutipartFile,因为MuitipartFile是不可序列化的,需要转为byte[]进行传递

解决方式

在Controller层将MultipartFile转为byte[]传递给Service层,如果需要MultipartFile携带的参数,也可以在Controller层获取后传给Service层。

Controller层

重点是使用multipartFile.getBytes()去将其转化为字节形式

/**
 * <p>
 *
 * </p>
 *
 * @author:雷子杰
 * @date:2022/8/7
 */
@RestController
@Api(tags = "阿里云对象存储ossAPI模块")
public class AliOssController {

    @Reference
    private AliOssService aliOssService;

    @PostMapping("/uploadImage")
    @ApiOperation(value = "图片上传")
    public Result upload(MultipartFile file){
        //因为dubbo中不能传递MultipartFile,所以需要转为字节后传过去再转回来
        byte[] arr=null;
        String fileName = file.getOriginalFilename();//获取文件名
        long fileSize = file.getSize();//获取图片大小
        
        try {
            arr = file.getBytes();
        } catch (IOException e) {
            e.printStackTrace();
        }
        String url = aliOssService.upload(arr,fileName,fileSize);

        return  Result.ok().data("url", url);
    }
}

Service层

重点是使用new ByteArrayInputStream(arr)将传过来的字节转换为流的格式

/**
 * <p>
 *
 * </p>
 *
 * @author:雷子杰
 * @date:2022/8/7
 */
@Service
@Component
@Slf4j
@Transactional
public class AliOssServiceImpl implements AliOssService {

    @Override
    public String upload(byte[] arr, String fileName, long fileSize) {
        InputStream inputStream=null;
        
        inputStream = new ByteArrayInputStream(arr);//将字节转换为流

        //拼接文件夹名字会指定上传到存储空间下面的子文件夹(文件名改为:当前时间到毫秒+uuid+原来文件后缀名)
        String originalFilename= Conts.IMAGESURL
                +System.currentTimeMillis()
                + UUID.randomUUID().toString()
                + fileName.substring(fileName.lastIndexOf("."));

        //使用封装的工具类进行上传
        OssManager.uploadImage(originalFilename, fileSize,inputStream);

        String url=OssManager.bucketDomain+"/"+originalFilename;
        log.debug("文件上传后的路径是{}",url);

        return url;
    }
}

总结

在编程的过程中总会遇到各式各样的问题,只有遇到的多了,总结的多了,我们才会有提升,在未来的道路上走的更远。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Dubbo是一款微服务开发框架,它提供了RPC通信与微服务治理两大关键能力。使用Dubbo开发的微服务可以实现远程发现与通信能力,并利用Dubbo提供的丰富服务治理能力,如服务发现、负载均衡、流量调度等。Dubbo还具有高度可扩展性,用户可以根据自己的业务需求自定义实现,改变框架的默认行为。Dubbo作为一个RPC框架,最核心的功能是跨网络的远程调用。在实践,可以创建一个服务提供方和一个服务消费方,通过Dubbo实现服务消费方远程调用服务提供方的方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [微服务开发框架——Dubbo](https://blog.csdn.net/qq_44961043/article/details/122546316)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [Dubbo系列之微服务框架整合教程](https://blog.csdn.net/u014427391/article/details/84455282)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习的大雄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值