解码base64 PDF并在JMeter中写入文件

时间:2017-03-27 17:58:54

标签: java jmeter beanshell

我正在尝试从响应中解码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();

修改

响应中的整个PDF如下所示:(这些只是前5行(大约7,548行),但它们都相似):

JVBERi0xLjQKMSAwIG9iago8PAovVGl0bGUgKP7/KQovQ3JlYXRvciAo/v8pCi9Qcm9kdWNlciAo
/v8AUQB0ACAANQAuADUALgAxKQovQ3JlYXRpb25EYXRlIChEOjIwMTcwMzI3MTgwNTEzKQo+Pgpl
bmRvYmoKMiAwIG9iago8PAovVHlwZSAvQ2F0YWxvZwovUGFnZXMgMyAwIFIKPj4KZW5kb2JqCjQg
MCBvYmoKPDwKL1R5cGUgL0V4dEdTdGF0ZQovU0EgdHJ1ZQovU00gMC4wMgovY2EgMS4wCi9DQSAx
LjAKL0FJUyBmYWxzZQovU01hc2sgL05vbmU+PgplbmRvYmoKNSAwIG9iagpbL1BhdHRlcm4gL0Rl

我认为这是导致问题的原因?有没有办法将响应转换为可以解码的单个字符串?

编辑2:

因此,响应中的
绝对是我的问题。我查了hex code character,它转换成回车。如果我在JMeter中手动复制响应,请将其粘贴到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();

2 个答案:

答案 0 :(得分:0)

这对我有用。输入数据是错误的。

package com.test;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Base64;

import org.junit.Test;

public class TestBase64 {

    String data = 
"JVBERi0xLjQKMSAwIG9iago8PAovVGl0bGUgKP7/KQovQ3JlYXRvciAo/v8pCi9Qcm9kdWNlciAo/v8AUQB0ACAANQAuADUALgAxKQovQ3JlYXRpb25EYXRlIChEOjIwMTcwMzI3MTgwNTEzKQo+Pgpl";
@Test
    public void decodeBase64()
    {
        byte[] localData = Base64.getDecoder().decode(data);

        try (FileOutputStream out = new FileOutputStream("/testout64.dat"))
        {
            out.write(localData);

            out.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

这导致

%PDF-1.4
1 0 obj
<<
/Title (þÿ)
/Creator (þÿ)
/Producer (þÿ Q t   5 . 5 . 1)
/CreationDate (D:20170327180513)
>>
e

似乎是有效的PDF。 什么是&amp; _#_ x_d _; _部分?似乎是一些自定义格式字符。

答案 1 :(得分:0)

我基本上得到了我的问题的答案,问题是我试图解码的base64编码的响应是多行并包含回车十六进制代码。

我的解决方案是从响应中删除回车十六进制代码并将其压缩为单个base64编码文本字符串,然后将文件写出来。

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

String response = vars.get("documentText");
String encodedFile = response.replace("&#xd;","").replaceAll("[\n]+","");

// Decode the response
vars.put("decodedFile",new String(Base64.decodeBase64(encodedFile)));

// Write out the decoded file
Output = vars.get("decodedFile");
file = new FileOutputStream("C:\\Users\\user\\Desktop\\decodedFile.pdf");
p = new PrintStream(file); 
this.interpreter.setOut(p); 
print(Output);
p.flush();
file.close();