You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JMeter通过后端API上传PDF文件后内容丢失/损坏问题求助

解决JMeter上传PDF文件后损坏的问题

问题原因

你当前的BeanShell Preprocessor将PDF二进制数据直接转换为String存储到JMeter变量时,使用了默认字符编码(通常为UTF-8)。PDF属于二进制文件,包含大量非UTF-8兼容的字节,这种转换会破坏原始二进制数据,最终导致上传后的文件损坏。

解决方案

方案1:用ISO-8859-1编码保留原始字节

替换原BeanShell Preprocessor为JSR223 Preprocessor(推荐使用Groovy语言,性能更优),代码如下:

import java.io.FileInputStream;
import java.io.ByteArrayOutputStream;

// 路径需用双反斜杠转义
FileInputStream in = new FileInputStream("C:\\Users\\XYZ\\Downloads\\PT_003.pdf");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int i;
while ((i = in.read(buffer)) != -1) {
    bos.write(buffer, 0, i);
}
in.close();
byte[] binarydata = bos.toByteArray();
bos.close();

// 用ISO-8859-1编码转换为String,完整保留所有原始字节
vars.put("binarydata", new String(binarydata, "ISO-8859-1"));

修改Multipart请求体的File部分,修正传输编码:

--AaC07x
content-disposition: form-data; name="File"; filename="PT_003.pdf"
Content-Type: application/pdf
Content-Transfer-Encoding: binary

${binarydata}
--AaC07x--

方案2:用Base64编码传输二进制数据

通过JSR223 Preprocessor将PDF二进制数据编码为Base64:

import org.apache.commons.io.FileUtils;
import org.apache.commons.codec.binary.Base64;

File file = new File("C:\\Users\\XYZ\\Downloads\\PT_003.pdf");
byte[] binaryData = FileUtils.readFileToByteArray(file);
String base64Data = Base64.encodeBase64String(binaryData);
vars.put("base64data", base64Data);

修改请求体的File部分:

--AaC07x
content-disposition: form-data; name="File"; filename="PT_003.pdf"
Content-Type: application/pdf
Content-Transfer-Encoding: base64

${base64data}
--AaC07x--

额外检查项

  • 确认请求头的Content-Type中boundary与请求体的分隔符完全一致,可尝试去掉boundary的引号:
    Content-Type: multipart/related; boundary=AaC07x
    
  • 确保文件路径格式正确,Java环境下需用双反斜杠(\\)或正斜杠(/)转义路径分隔符。

内容的提问来源于stack exchange,提问作者Pratik Dey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 09:15:33