学习java遇到的错误

在Spring Boot项目中使用FastDFSClient上传文件时遇到空指针异常,问题源于MultipartFile与MultipartResolver之间的冲突。解决方案是移除multipartResolver配置,将参数改为MultipartFile数组,并将数组转换为字符串再获取字节进行上传。修改后的代码成功上传了文件。
摘要由CSDN通过智能技术生成

项目场景:

提示:这里简述项目相关背景:

FastDFSClient上传文件提示空指针异常,MultipartFile获取不到文件

问题描述

在文件上传时一直提示空指针异常,一开始以为时虚拟机的连接错误,先后修改连接地址,修改配置文件等做了很多无用功。最后发现方法中参数获取文件时获取不到,参数file直接就是null.
最初代码如下:

@Value("${FILE_SERVER_URL}")
    private String FILE_SERVER_URL;//文件服务器地址
    //上传功能
    @PostMapping("upload")
    public Result upload(MultipartFile file){
        try{
            FastDFSClient client = new FastDFSClient("fdfs_client.conf");
            String str = client.uploadFile(file.getBytes(),"jpeg");
            String result = FILE_SERVER_URL + str;
            return new Result(true,StatusCode.OK,"上传成功",result);
        }catch (Exception e){
            e.printStackTrace();
            return new Result(false,StatusCode.ERROR,"上传失败",null);
        }
    }

原因分析:

提示:这里填写问题的分析:
自己找了好长时间没有解决错误,最后看到一篇分析,突然就理解了
spring-boot自带的org.springframework.web.multipart.MultipartFile
和Multipart产生冲突,如果同时使用了MultipartResolver 和ServletFileUpload,就会在iter.hasNext()返回false.然后整个循环就跳出去了。整个问题产生的原因是Spring框架先调用了MultipartResolver 来处理http multi-part的请求。这里http multipart的请求已经消耗掉。后面又交给ServletFileUpload ,那么ServletFileUpload 就获取不到相应的multi-part请求。因此将multipartResolve配置去除,问题就解决了。单文件的话只需要一个变量,多文件上传的话就将MultipartFile改为数组,然后分别上传保存即可。


解决方案:

提示:这里填写该问题的具体解决方案:将方法中参数改为数组,在读取文件时先将数组toString()转成字符在获取字节即可getBytes()。试了一下果然解决了错误。

修改后代码如下:

 @Value("${FILE_SERVER_URL}")
    private String FILE_SERVER_URL;//文件服务器地址
    @PostMapping("upload")
    public Result upload(MultipartFile[] file) {
        try {
            //2、创建一个 FastDFS 的客户端
            FastDFSClient fastDFSClient = new FastDFSClient("fdfs_client.conf");
            //3、执行上传处理
            String path = fastDFSClient.uploadFile(file.toString().getBytes(),"jpeg");
            //4、拼接返回的 url 和 ip 地址,拼装成完整的 url
            String url = FILE_SERVER_URL + path;
            return new Result(true, StatusCode.OK, "上传成功",url);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false, StatusCode.ERROR, "上传失败");
        }
    }
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值