当前位置: 首页 > news >正文

qw-110-

import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.http.MediaType;
import org.springframework.http.client.MultipartBodyBuilder;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

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

public class ExcelUploadService {

private final WebClient webClient;

public ExcelUploadService(String thirdPartyBaseUrl) {
this.webClient = WebClient.builder()
.baseUrl(thirdPartyBaseUrl)
.build();
}

/**
* 上传Excel文件到第三方接口
* @param workbook Excel工作簿对象
* @param fileName 文件名
* @param additionalParams 额外的参数
* @param uploadUrl 上传接口URL
* @return 响应结果
*/
public Mono<String> uploadExcel(Workbook workbook, String fileName,
Map<String, String> additionalParams, String uploadUrl) {
try {
// 1. 将Workbook转换为字节数组
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
workbook.write(outputStream);
byte[] fileBytes = outputStream.toByteArray();
outputStream.close();

// 2. 构建Multipart表单数据
MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder();

// 添加Excel文件
bodyBuilder.part("file", fileBytes)
.filename(fileName)
.contentType(MediaType.APPLICATION_OCTET_STREAM);

// 添加其他参数
if (additionalParams != null) {
additionalParams.forEach((key, value) ->
bodyBuilder.part(key, value));
}

// 3. 构建请求体
var multipartBody = bodyBuilder.build();

// 4. 发送POST请求
return webClient.post()
.uri(uploadUrl)
.contentType(MediaType.MULTIPART_FORM_DATA)
.body(BodyInserters.fromMultipartData(multipartBody))
.retrieve()
.bodyToMono(String.class)
.doOnSuccess(response -> System.out.println("上传成功: " + response))
.doOnError(error -> System.err.println("上传失败: " + error.getMessage()));

} catch (IOException e) {
return Mono.error(new RuntimeException("Excel文件处理失败", e));
}
}

/**
* 上传Excel文件(简化版本,仅包含文件)
*/
public Mono<String> uploadExcel(Workbook workbook, String fileName, String uploadUrl) {
return uploadExcel(workbook, fileName, null, uploadUrl);
}

/**
* 使用DataBuffer方式上传(适用于大文件)
*/
public Mono<String> uploadExcelWithBuffer(Workbook workbook, String fileName,
Map<String, String> additionalParams, String uploadUrl) {
try {
// 将Workbook转换为字节数组
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
workbook.write(outputStream);
byte[] fileBytes = outputStream.toByteArray();
outputStream.close();

// 使用DataBuffer包装字节数组
DataBuffer dataBuffer = DataBufferUtils.wrap(fileBytes);

MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder();
bodyBuilder.part("file", dataBuffer)
.filename(fileName)
.contentType(MediaType.APPLICATION_OCTET_STREAM);

if (additionalParams != null) {
additionalParams.forEach((key, value) ->
bodyBuilder.part(key, value));
}

var multipartBody = bodyBuilder.build();

return webClient.post()
.uri(uploadUrl)
.contentType(MediaType.MULTIPART_FORM_DATA)
.body(BodyInserters.fromMultipartData(multipartBody))
.retrieve()
.bodyToMono(String.class);

} catch (IOException e) {
return Mono.error(new RuntimeException("Excel文件处理失败", e));
}
}
}

 

http://www.jsqmd.com/news/26979/

相关文章:

  • qw-33
  • qw-12
  • vscode cursor中在终端里使用claude code,经常会闪烁,并且粘贴进长文本会有问题。
  • reactive -03
  • reactive - 02
  • reactive-01
  • revit api获取excursion 拉伸体的轮廓和平面sketchplane GeometryCreationUtilities
  • revit api创建模型线
  • revit 创建sketchplane
  • revit api创建参考线
  • 【AI说HTML 04】掌握核心文档结构标签的方法
  • revit api创建参考平面
  • 【AI说HTML 02】如何深刻建立对HTML的正确认知
  • 【AI说HTML 03】手把手教你搭建极简HTML开发环境
  • 图元编辑 移动 旋转 镜像等
  • 【AI说】如何深刻建立对HTML的正确认知
  • 计算机组成原理核心知识点梳理
  • revit api 内置族类型 walltype
  • 国产的编程语言
  • revit api族文件图元编辑 familyitem factory
  • 【AI说】HTML从零基础到精通路径
  • revit api 加载族文件+放置族实例 创建门图元
  • 一件有关山寨iPod shuffle 2的往事
  • revit api共享参数
  • [Vulhub]Sickos靶机渗透
  • revit api 过滤器获取元素
  • Skill Discovery | RGSD:基于高质量参考轨迹,预训练 skill space
  • revit api 事务和事务组
  • Ai元人文:价值权衡元能力的培育路径与开源生态构建
  • Ubuntu server配置Docker Daemon.json 顽固不生效