使用JMeter保存PDF内容至另一PDF时出现空文件问题
问题分析与解决方案
原代码存在的错误
- 变量名拼写错误:
new String(extarctdata)中的extarctdata是笔误,正确变量名应为extractdata,该错误会导致变量赋值失败,最终${extractdata}为空。 - 二进制数据错误转字符串:PDF属于二进制文件,直接将字节数组转换为
String会破坏二进制结构(字符编码转换会丢失或篡改二进制信息),写回文件时内容已损坏,无法被PDF阅读器识别。 - Windows路径未转义:Windows路径中的
\需要转义为\\,否则C:\Users\...中的\U会被解析为无效转义字符,导致无法读取原PDF文件,最终生成空文件。 - 未处理IO异常:代码未捕获文件读写时的
IOException,若文件不存在、路径错误或权限不足,会直接导致采样器执行失败。
修正后的代码
1. Beanshell采样器代码
import java.io.FileInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; try { // 修正路径转义,使用双反斜杠 FileInputStream in = new FileInputStream("C:\\Users\\Dey\\Downloads\\sample.pdf"); ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int i; while ((i = in.read(buffer)) != -1) { bos.write(buffer, 0, i); } // 规范关闭流顺序 bos.close(); in.close(); byte[] extractdata = bos.toByteArray(); // 使用putObject存储二进制字节数组,避免转字符串丢失数据 vars.putObject("extractdata", extractdata); } catch (IOException e) { // 打印异常便于排查问题 log.error("读取PDF文件失败: " + e.getMessage(), e); throw e; // 抛出异常标记采样器执行失败 }
2. Beanshell后置处理器代码
import java.io.FileOutputStream; import java.io.IOException; try { // 从JMeter变量中获取二进制字节数组 byte[] extractdata = (byte[]) vars.getObject("extractdata"); if (extractdata != null && extractdata.length > 0) { FileOutputStream out = new FileOutputStream("C:\\Users\\Dey\\Downloads\\output.pdf"); out.write(extractdata); out.close(); } else { log.warn("未获取到有效的PDF二进制数据"); } } catch (IOException e) { log.error("写入PDF文件失败: " + e.getMessage(), e); throw e; }
额外说明
- 若使用JMeter 3.1及以上版本,推荐用JSR223采样器/后置处理器替代Beanshell,JSR223支持Groovy语言,性能更高且语法更简洁。
- 确保原PDF文件路径正确,且JMeter具备读取原文件、写入目标路径的权限。
内容的提问来源于stack exchange,提问作者avidey
相关产品推荐
相关产品推荐

