【发布时间】:2017-03-28 20:34:28
【问题描述】:
我正在尝试从响应中解码 pdf 并将其写入文件。
文件已创建并且文件大小似乎正确,但是当我打开它时,我收到一条错误消息:“打开此文档时出错。文件已损坏,无法打开修复。”
我正在使用来自this post 的代码来解码和创建文件。
我将API返回的base64编码文件设置为变量vars.get("documentText")
这是我的 BeanShell PostProcessor 代码的外观:
import org.apache.commons.io.FileUtils;
import org.apache.commons.codec.binary.Base64;
String Createresponse= vars.get("documentText");
vars.put("response",new String(Base64.decodeBase64(Createresponse.getBytes("UTF-8"))));
Output = vars.get("response");
f = new FileOutputStream("C:\\Users\\user\\Desktop\\Test.pdf");
p = new PrintStream(f);
this.interpreter.setOut(p);
print(Output);
f.close();
我是不是做错了什么?
我也做了以下,但得到了相同的结果:
byte[] data = Base64.decodeBase64(vars.get("documentText"));
FileOutputStream out = new FileOutputStream("C:\\Users\\user\\Desktop\\Test.pdf");
out.write(data);
out.close();
编辑:
Response 中的整个 PDF 如下所示:(这些只是前 5 行(大约 7,548 行),但它们都相似):
JVBERi0xLjQKMSAwIG9iago8PAovVGl0bGUgKP7/KQovQ3JlYXRvciAo/v8pCi9Qcm9kdWNlciAo
/v8AUQB0ACAANQAuADUALgAxKQovQ3JlYXRpb25EYXRlIChEOjIwMTcwMzI3MTgwNTEzKQo+Pgpl
bmRvYmoKMiAwIG9iago8PAovVHlwZSAvQ2F0YWxvZwovUGFnZXMgMyAwIFIKPj4KZW5kb2JqCjQg
MCBvYmoKPDwKL1R5cGUgL0V4dEdTdGF0ZQovU0EgdHJ1ZQovU00gMC4wMgovY2EgMS4wCi9DQSAx
LjAKL0FJUyBmYWxzZQovU01hc2sgL05vbmU+PgplbmRvYmoKNSAwIG9iagpbL1BhdHRlcm4gL0Rl
我假设这是导致问题的原因?有没有办法将响应转换为可以解码的单个字符串?
编辑 2:
所以回复中的
 绝对是我的问题。我查找了hex code character,它转换为回车。如果我从 JMeter 中手动复制 Response,将其粘贴到 Notepad++ 中,删除 
,然后手动解码,PDF 会正常打开。
我尝试修改我的 BeanShell 脚本以删除回车然后对其进行解码,但它仍然不能完全正常工作。 PDF 现在打开,但是,它只是空白的白页。这是我更新的代码:
String Createresponse= vars.get("documentText");
String b64 = Createresponse.replace("
","");
vars.put("response",new String(Base64.decodeBase64(b64)));
Output = vars.get("response");
f = new FileOutputStream("C:\\Users\\user\\Desktop\\Test.pdf");
p = new PrintStream(f);
this.interpreter.setOut(p);
print(Output);
f.close();
【问题讨论】:
-
你能检查一下查看结果树中的 pdf 响应是什么吗?你可以参考这篇文章来了解如何阅读。 dzone.com/articles/how-to-read-a-pdf-file-in-apache-jmeter
-
解码应该使用字符串。 getBytes("UTF-8") 可能返回错误。
-
我已经更新了问题,并举例说明了 PDF 响应的前几行是什么样的