尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

qw-12

qw-12
📅 发布时间:2026/6/19 3:04:31

import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.http.MediaType;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.reactive.function.client.WebClientResponseException;
import reactor.core.publisher.Mono;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;

public class ExcelUploadService {

private final WebClient webClient;

public ExcelUploadService(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.build();
}

/**
* 上传Excel文件到第三方接口 - 使用Multipart方式
* @param workbook Excel工作簿对象
* @param fileName 文件名
* @param uploadUrl 上传接口URL
* @return 上传结果
*/
public Mono<String> uploadExcelFile(org.apache.poi.ss.usermodel.Workbook workbook,
String fileName, String uploadUrl) {
return Mono.fromCallable(() -> {
// 将Workbook转换为字节数组
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
workbook.write(outputStream);
byte[] fileBytes = outputStream.toByteArray();
outputStream.close();
return fileBytes;
})
.flatMap(fileBytes -> {
// 创建Multipart表单数据
MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();
ByteArrayResource fileResource = new ByteArrayResource(fileBytes) {
@Override
public String getFilename() {
return fileName;
}
};

formData.add("file", fileResource);
formData.add("filename", fileName);

return webClient.post()
.uri(uploadUrl)
.contentType(MediaType.MULTIPART_FORM_DATA)
.bodyValue(formData) // 这里是正确的用法
.retrieve()
.bodyToMono(String.class)
.onErrorMap(WebClientResponseException.class, ex ->
new RuntimeException("上传失败: " + ex.getResponseBodyAsString(), ex));
});
}

/**
* 使用BodyInserters.multipartData的方式上传
*/
public Mono<String> uploadExcelWithBodyInserters(org.apache.poi.ss.usermodel.Workbook workbook,
String fileName, String uploadUrl) {
return Mono.fromCallable(() -> {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
workbook.write(outputStream);
return outputStream.toByteArray();
})
.flatMap(fileBytes -> {
ByteArrayResource fileResource = new ByteArrayResource(fileBytes) {
@Override
public String getFilename() {
return fileName;
}
};

var multipartBuilder = BodyInserters
.fromMultipartData("file", fileResource)
.with("filename", fileName);

return webClient.post()
.uri(uploadUrl)
.body(multipartBuilder)
.retrieve()
.bodyToMono(String.class);
});
}

/**
* 使用Base64编码的方式上传
*/
public Mono<String> uploadExcelAsBase64(org.apache.poi.ss.usermodel.Workbook workbook,
String fileName, String uploadUrl) {
return Mono.fromCallable(() -> {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
workbook.write(outputStream);
byte[] fileBytes = outputStream.toByteArray();
String base64Content = Base64.getEncoder().encodeToString(fileBytes);
return base64Content;
})
.flatMap(base64Content -> {
var requestObject = new UploadRequest();
requestObject.setFileName(fileName);
requestObject.setFileContent(base64Content);
requestObject.setFileType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

return webClient.post()
.uri(uploadUrl)
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(requestObject) // JSON请求体
.retrieve()
.bodyToMono(String.class);
});
}

// 上传请求对象
static class UploadRequest {
private String fileName;
private String fileContent;
private String fileType;

// Getters and Setters
public String getFileName() { return fileName; }
public void setFileName(String fileName) { this.fileName = fileName; }

public String getFileContent() { return fileContent; }
public void setFileContent(String fileContent) { this.fileContent = fileContent; }

public String getFileType() { return fileType; }
public void setFileType(String fileType) { this.fileType = fileType; }
}
}

 

 

======================================

 

 

// 使用示例
public class Example {
public static void main(String[] args) {
// 假设你已经有了Workbook对象和文件名
Workbook workbook = ...; // 你的POI Workbook对象
String fileName = "example.xlsx";
String uploadUrl = "https://api.example.com/upload";

ExcelUploadService uploadService = new ExcelUploadService("https://api.example.com");

// 上传文件
uploadService.uploadExcelFile(workbook, fileName, uploadUrl)
.subscribe(
response -> System.out.println("上传成功: " + response),
error -> System.err.println("上传失败: " + error.getMessage())
);
}
}

 

 

=====================================

import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.http.MediaType;
import org.springframework.http.codec.multipart.FilePart;
import org.springframework.mock.web.reactive.function.multipart.DefaultFilePart;
import reactor.core.publisher.Mono;
import reactor.netty.http.client.HttpClient;
import io.netty.handler.codec.http.multipart.HttpData;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class ExcelUploadService {

private final WebClient webClient;

public ExcelUploadService(String baseUrl) {
this.webClient = WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(
HttpClient.create().responseTimeout(Duration.ofMinutes(5))
))
.build();
}

/**
* 上传Excel文件到第三方接口
* @param workbook POI Workbook对象
* @param fileName 文件名
* @param uploadUrl 上传接口URL
* @return 响应结果
*/
public Mono<String> uploadExcelFile(Workbook workbook, String fileName, String uploadUrl) {
return Mono.fromCallable(() -> {
// 将Workbook转换为字节数组
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
workbook.write(outputStream);
byte[] fileBytes = outputStream.toByteArray();
outputStream.close();
return fileBytes;
})
.flatMap(fileBytes -> {
// 创建WebClient请求
return webClient.post()
.uri(uploadUrl)
.contentType(MediaType.MULTIPART_FORM_DATA)
.body(BodyInserters.fromMultipartData()
.part("file",
org.springframework.core.io.ByteArrayResource(fileBytes, fileName))
.part("filename", fileName))
.retrieve()
.bodyToMono(String.class);
});
}

/**
* 使用ReactiveHttpClient的另一种实现方式
*/
public Mono<String> uploadExcelWithReactiveClient(Workbook workbook, String fileName, String uploadUrl) {
try {
// 将Workbook转换为字节数组
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
workbook.write(outputStream);
byte[] fileBytes = outputStream.toByteArray();

// 使用WebClient构建multipart请求
return webClient.post()
.uri(uploadUrl)
.contentType(MediaType.MULTIPART_FORM_DATA)
.body(BodyInserters.fromValue(
MultipartBodyBuilder()
.part("file", new org.springframework.core.io.ByteArrayResource(fileBytes) {
@Override
public String getFilename() {
return fileName;
}
})
.part("fileName", fileName)
.build()
))
.retrieve()
.bodyToMono(String.class);

} catch (IOException e) {
return Mono.error(e);
}
}

/**
* 更完整的上传实现,包含错误处理和进度监控
*/
public Mono<UploadResponse> uploadExcelWithProgress(Workbook workbook, String fileName, String uploadUrl) {
return Mono.fromCallable(() -> {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
workbook.write(outputStream);
return outputStream.toByteArray();
})
.flatMap(fileBytes -> {
return webClient.post()
.uri(uploadUrl)
.contentType(MediaType.MULTIPART_FORM_DATA)
.body(BodyInserters.fromMultipartData(builder -> {
builder.part("file",
new org.springframework.core.io.ByteArrayResource(fileBytes) {
@Override
public String getFilename() {
return fileName;
}
})
.part("originalFileName", fileName)
.part("size", String.valueOf(fileBytes.length));
}))
.retrieve()
.onStatus(HttpStatus::isError, clientResponse -> {
return clientResponse.bodyToMono(String.class)
.flatMap(errorBody -> Mono.error(
new UploadException("Upload failed: " + errorBody)
));
})
.bodyToMono(String.class)
.map(responseBody -> UploadResponse.success(responseBody))
.onErrorMap(UploadException.class, ex -> ex)
.onErrorMap(Exception.class, ex -> new UploadException("Upload error", ex));
});
}

// 响应包装类
public static class UploadResponse {
private boolean success;
private String message;
private Object data;

public static UploadResponse success(String message) {
UploadResponse response = new UploadResponse();
response.success = true;
response.message = message;
return response;
}

public static UploadResponse error(String message) {
UploadResponse response = new UploadResponse();
response.success = false;
response.message = message;
return response;
}

// getter和setter方法
public boolean isSuccess() { return success; }
public void setSuccess(boolean success) { this.success = success; }
public String getMessage() { return message; }
public void setMessage(String message) { this.message = message; }
public Object getData() { return data; }
public void setData(Object data) { this.data = data; }
}

// 自定义异常类
public static class UploadException extends Exception {
public UploadException(String message) {
super(message);
}

public UploadException(String message, Throwable cause) {
super(message, cause);
}
}
}

 

相关新闻

  • vscode cursor中在终端里使用claude code,经常会闪烁,并且粘贴进长文本会有问题。
  • revit api创建模型线
  • revit api创建参考线

最新新闻

  • 2026郑州非急救转运救护车TOP5盘点|中原跨省、嵩山山地、院区转诊首选康跃转运 - 吉修匠
  • 2026.6.7
  • OpenFigen:开源AI模型服务化与工作流编排的工程实践指南
  • 2026东莞石龙工厂法律顾问哪家好?工厂法务首选5家律所盘点(首选广东卡夫律师事务所) - GrowthUME
  • 2026北京防水补漏权威指南:卫生间/屋面/外墙/地下室正规施工+透明报价+避坑全攻略 - 苏易修缮
  • 南通同城购宠指南:钟秀中路+天都花苑正规宠舍,无套路带质保 - 萌宠俱乐部

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号