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

qw-33

import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.netty.http.client.HttpClient; import reactor.netty.http.client.HttpClientResponse; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; // 或 HSSFWorkbook import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.UUID; public class ExcelUploader { public static Mono<HttpClientResponse> uploadExcel( Workbook workbook, String originalFilename, String uploadUrl) { // Step 1: 将 Workbook 写入 byte[] byte[] excelBytes; try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { workbook.write(baos); excelBytes = baos.toByteArray(); } catch (IOException e) { return Mono.error(new RuntimeException("Failed to serialize workbook", e)); } // Step 2: 构建 multipart/form-data body String boundary = "----ReactorNettyBoundary" + UUID.randomUUID().toString(); String contentType = "multipart/form-data; boundary=" + boundary; Flux<ByteBuf> body = createMultipartData(boundary, excelBytes, originalFilename); // Step 3: 发送 POST 请求 return HttpClient.create() .post() .uri(uploadUrl) .header("Content-Type", contentType) .send(body) .response(); // 返回响应,可进一步处理 } private static Flux<ByteBuf> createMultipartData(String boundary, byte[] fileBytes, String filename) { String crlf = "\r\n"; String twoHyphens = "--"; // Part 1: 文件头 String fileHeader = twoHyphens + boundary + crlf + "Content-Disposition: form-data; name=\"file\"; filename=\"" + filename + "\"" + crlf + "Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" + crlf + crlf; // Part 2: 文件尾 String footer = crlf + twoHyphens + boundary + twoHyphens + crlf; return Flux.concat( // 文件头(文本) Flux.just(fileHeader) .map(s -> Unpooled.wrappedBuffer(s.getBytes(StandardCharsets.UTF_8))), // 文件内容(二进制) Flux.just(Unpooled.wrappedBuffer(fileBytes)), // 结尾 Flux.just(footer) .map(s -> Unpooled.wrappedBuffer(s.getBytes(StandardCharsets.UTF_8))) ); } }
http://www.jsqmd.com/news/26978/

相关文章:

  • 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 顽固不生效
  • sunpinyin online的简单例子