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
相关产品推荐
相关产品推荐

