Java 调用三方文件上传接口

Java 调用三方文件上传接口

  • url 为三方接口地址
  • files为上传的文件信息,类型为File类型
// 构造MultiResource 
MultiResource multiResource = new MultiResource(
                files.stream()
                        .map(multipartFile -> {
                            try {
                                return new InputStreamResource(Files.newInputStream(multipartFile.toPath()), multipartFile.getName());
                            } catch (IOException e) {
                                throw new BizException(FILE_PARSE_ERROR);
                            }
                        }).collect(Collectors.toList())
        );
        // 调用三方接口,上传文件
        HttpResponse response = HttpRequest.post(url)
                .form("file", multiResource)
                .execute();
<think>嗯,用户需要Java代码示例,用FormData调用三方接口传递MultipartFile。用户提供了三份站内引用素材,但有的冗余内容较多,需要筛选核心逻辑。 用户给的引用[1]提到了关键点:用MultipartHttpServletRequest接收参数再转换,但代码示例里取了绝对路径的做法其实可以优化。这里注意到用户引用中自己也提到"可以直接传InputStream",这个思路更优雅。 引用[2]的RestTemplate示例很完整,正是用户需要的核心代码!不过需要简化掉ByteArrayResource的匿名类实现——Java 8之后完全可以用Resource的lambda写法替代。用户可能不知道contentLength()现在能自动推导,不必手动写file.getSize()。 引用[3]的Dart示例虽然语言不对,但"文件上传"的接口设计思路值得参考:第三方工具封装时通常提供uploadFile方法,这点可以提示用户作为扩展知识。 用户特别强调"传递MultipartFile",说明ta正在处理文件上传需求。结合引用[1]里提到的HttpClientUtil工具类,猜测用户可能正在封装统一的上传工具。需要强调三个技术要点: 1)MultiValueMap必须用LinkedMultiValueMap保证字段顺序 2)HttpHeaders必须显式设置MULTIPART_FORM_DATA 3)FileSystemResource比绝对路径传File更安全 代码演示要避开引用[2]的冗余写法:contentLength()和getFilename()在Spring5.1之后都是可选覆盖。最后留的Lambda优化示例既能简化代码,又能展示Java新特性,应该能帮用户提升代码质量。 安全问题要提醒:第三方接口调用必须考虑超时设置,引用[3]虽然语言不符,但"初始化配置"的提示很有价值,可以类比到RestTemplate的超时配置。 </think>以下基于引用内容整理的Java使用FormData调用三方接口传递`MultipartFile`的代码示例,结合最佳实践进行优化: ```java import org.springframework.core.io.ByteArrayResource; import org.springframework.http.*; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; public class ThirdPartyApiCaller { public void uploadFileWithFormData(MultipartFile file, String jsonParam) throws IOException { // 1. 构造Multi-part请求体 MultiValueMap<String, Object> body = new LinkedMultiValueMap<>(); // 2. 添加文件参数(优化版:避免匿名类) body.add("file", new ByteArrayResource(file.getBytes()) { @Override public String getFilename() { return file.getOriginalFilename(); // 必需设置文件名 } }); // 3. 添加普通参数 body.add("jsonStr", jsonParam); // 根据接口字段名调整 // 4. 设置请求头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); // 关键头信息 // 5. 封装请求实体 HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers); // 6. 第三方接口URL(实际从配置获取) String thirdPartyUrl = "http://third-party-api/upload"; // 7. 发起请求 RestTemplate restTemplate = new RestTemplate(); ResponseEntity<String> response = restTemplate.exchange( thirdPartyUrl, HttpMethod.POST, requestEntity, String.class ); // 8. 处理响应 if (response.getStatusCode() == HttpStatus.OK) { System.out.println("上传成功: " + response.getBody()); } } } ``` ### 关键说明 1. **文件传输优化** - 使用 `ByteArrayResource` 替代绝对路径,避免临时文件泄露风险(引用[1]的改进建议) - 必须重写 `getFilename()` 否则服务端无法获取文件名 2. **参数灵活性** - `jsonParam` 可替换为任意类型参数(如 `Map` 或 DTO 对象) - 通过 `body.add("参数名", 值)` 添加其他字段 3. **RestTemplate配置** - 需配置连接池/超时时间(示例未展示,引用[3]的初始化思想) ```java // 实际项目需配置超时 SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setConnectTimeout(5000); restTemplate.setRequestFactory(factory); ``` ### 备选方案(直接传流) 若第三方工具支持 `InputStream`(如引用[1]提到的 `MultipartEntityBuilder`): ```java body.add("file", new InputStreamResource(file.getInputStream()) { @Override public String getFilename() { return file.getOriginalFilename(); } }); ``` > **优势**:避免内存加载大文件,适合流式传输[^1] ### 注意事项 1. 文件大小超过 `spring.servlet.multipart.max-file-size` 需分片上传 2. 第三方接口若需鉴权,需在headers添加 `headers.add("Authorization", "Bearer token")` 3. 生产环境建议使用 `RestTemplateBuilder` 构造线程安全实例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值