Python调用应用上传文件接口,被应用日志提示Failed to parse multipart servlet request处理

项目场景

一个基于tomcat的应用,提供了文件上传接口,通过Python程序调用上传文件接口,应用日志报错:
Failed to parse multipart servlet request
Invalid chunk header
No data available due to previous error

问题分析

看报错,都是提示请求体错误,所以我通过添加代码的方式挂了个BP代理:

//代理设置,先通过本地的8080端口,同时bp监听本地8080
fiddler_proxies = {'http': 'http://127.0.0.1:8080', 'https': 'http://127.0.0.1:8080'}
//请求中添加proxies=fiddler_proxies
response = requests.post(url=url, headers=self.headers, files=files, proxies=fiddler_proxies)

但添加代理后,可正常发起请求;关闭代理后,无法正常发起请求;同时看代理抓取的请求头和请求体均正常。
故决定代码中同时将self.headers(请求头)给打印出来。

对照后发现,发送的请求头多了一个Transfer-Encoding: chunked
经查询,使用requests发起请求时不需要这个请求头,考虑是请求头异常,导致tomcat无法正常解析,故停止接收获取请求体,产生文件内容异常的报错,而通过代理时,包先在windows系统停留,对请求头进行了纠正,所以可以正常发起请求

解决方案

代码中注释掉Transfer-Encoding: chunked请求体即可,若是其它报错,建议参照接口文档。

### 解决 Spring Boot 文件下载时 `Failed to parse multipart servlet request` 错误 当遇到文件下载接口抛出 `org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request` 的错误时,通常是因为请求处理过程中出现了不兼容的情况。具体原因可能涉及多个方面。 #### 请求头设置不当 如果在 Postman 或其他 API 测试工具中手动设定了 `Content-Type` 头部字段,则可能会引发此问题。移除该头部设定可以解决问题[^4]: ```http POST /download HTTP/1.1 Host: example.com // 不要在此处指定 Content-Type ``` #### 配置 MultipartFile 参数解析器 确保应用程序正确配置了用于解析多部分表单数据的组件。对于 Spring Boot 应用程序,默认情况下会自动配置好这些组件,但如果自定义了某些 Bean 定义或修改过默认行为,则需确认未破坏原有机制。 #### 调整临时存储路径权限 有时由于操作系统级别的安全策略限制,Tomcat 可能无法访问其试图使用的临时目录来保存上传的数据流片段。这可以通过调整应用服务器的工作空间位置或是赋予相应读写权限给目标文件夹的方式来修复[^3]: ```properties # application.properties 中添加如下配置项 spring.servlet.multipart.location=/path/to/custom/temp/dir/ ``` #### 修改控制器方法签名 为了更好地支持 GET 方式的资源获取操作,在编写 RESTful Web Service 控制器的方法时应避免接收 `MultipartFile` 类型参数,因为这类对象主要用于表示通过 POST 提交过来的文件内容。相反地,应当专注于返回字节数组或其他适合传输二进制资料的形式: ```java @GetMapping("/files/{id}") public ResponseEntity<byte[]> downloadFile(@PathVariable String id) { byte[] fileBytes = service.getFileById(id); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); headers.setContentDispositionFormData("attachment", "filename.ext"); return new ResponseEntity<>(fileBytes, headers, HttpStatus.OK); } ``` 以上措施有助于缓解并最终消除因尝试从非预期类型的 HTTP 请求中提取附件而导致的一系列异常状况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值