Java应用程序或Groovy脚本,用于将图像文件存储为来自http响应正文的.jpg,内容类型为SOAP UI中的image / jpeg

时间:2017-05-05 13:15:30

标签: image soapui httpresponse

API GET响应返回正文中的图像,如下所示:这不是附件。

Date : Fri, 05 May 2017 12:26:00 GMT
status : HTTP/1.1 200 OK
Content-Length : 12888
Content-Type : image/jpeg
Server : Apache-Coyote/1.1
X-Content-Type-Options : nosniff
Cache-Control : no-cache
Cache-Control : no-store
Cache-Control : max-age=0

ÿØÿà JFIF  ` `  ÿáÈExif  MM *    2       J;       ^GF       GI     ?  ‡i       
f   Æ2009:03:12 13:48:28 Corbis   ?       œ?       °’‘    17  ’’    17      
2008:02:11 11:32:43 2008:02:11 11:32:43                       (             $      

œ       `      `   ÿØÿÛ C       

 $.' ",#(7),01444'9=82<.342ÿÛ C         

2!!2 ...... and so on.

邮差解码图像显示它,在这种情况下它是动物。

我必须使用soapUI中的groovy脚本将响应存储为图像文件(.jpg)(soapUI用于测试API)

这是我在Groovy Script步骤中尝试过的,但保存的图像难以理解。

testRunner.runTestStepByName("GETjpg");
def getImageResponse = 
context.testCase.testSteps["GETjpg"].getPropertyValue("Response");
byte[] imageData = getImageResponse.getBytes();
// Converting Image byte array into Base64 String
String imageDataString = encodeImage(imageData);

// Converting a Base64 String into Image byte array
byte[] imageByteArray = decodeImage(imageDataString);

// Write a image byte array into file system
FileOutputStream imageOutFile = new FileOutputStream("C:\\animal.jpg");
imageOutFile.write(imageByteArray);
imageOutFile.close();

public static String encodeImage(byte[] imageByteArray) {
    return new sun.misc.BASE64Encoder().encode(imageByteArray);
}

public static byte[] decodeImage(String imageDataString) {
    return new sun.misc.BASE64Decoder().decodeBuffer(imageDataString);
}

我想我正在做的以.jpg格式保存图像是不正确的。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

这就是我这样做的方式。从http GET请求的脚本断言。希望它可以帮助某人。

def ins = context.httpResponse.getRawResponseBody();
def isImageSaved = false;
InputStream inputStream;
FileOutputStream outputStream;
if (ins){
    try {
        inputStream = new ByteArrayInputStream(ins);
        outputStream = new FileOutputStream(new File(context.expand("C:\\animal.jpg")));
        int read = 0;
        byte[] bytes = new byte[1024];

        while ((read = inputStream.read(bytes)) != -1) {
            outputStream.write(bytes, 0, read);
        }
        isImageSaved = true;

    }catch (Exception e){
        log.error e;
        e.printStackTrace();
    }finally{
        inputStream.close();
        outputStream.close();       
    }   
} else {
    log.error "image does not exist...";
}

context.testCase.setPropertyValue("isImageSaved", isImageSaved.inspect());

答案 1 :(得分:0)

简短回答

您需要获取实际的字节数(raw)以避免使用字节数组转换为文本缓冲。

byte[] response = context.httpResponse.getRawResponseBody()

pathname = "C:\\Users\\mdirickx\\Pictures\\soapui\\file_cat_bytesRaw05.jpeg"
FileOutputStream fos = new FileOutputStream(pathname);
fos.write(response);
fos.close();

原因

我努力与某些人相似。最后我把它扔了,因为我没时间。

但有些指示: JFIF网站:https://www.loc.gov/preservation/digital/formats/fdd/fdd000018.shtml

你潜入BASE64,但实际上这不是开始的地方。 base64编码的jpeg将以/9j/4AAQSkZJRgA...开头。

你没有这样的字符串。您的字符串表示以ÿØÿà JFIF...开头。当您在HEX编辑器中拖动jpeg文件时,这正是您获得的字符串表示。如果你想尝试它,而你没有HEX编辑器,那么将一个jpeg文件拖到记事本中。您会看到它也以ÿØÿà JFIF开头。

如果您在服务响应和记事本应用程序中看到图像的字符串表示,您可能会看到一些差异。这可能是因为字符编码。这里的问题的真相是表示可能有缺陷,因为每个字节集都不能用字符表示。

关键是找出如何获取发送的实际字节数组而不是你可以看到的响应,这实际上是一个由SoapUI咀嚼的字节数组,以表示给SoapUI工具的用户。

本论文得到以下实验的支持:

  1. 拍摄网络上的图片并保存
  2. 将SoapUI响应正文中的内容另存为文件
  3. 在十六进制编辑器中打开
  4. 按字节码级别对文件进行比较
  5. 你会发现大量的角色(90,91,80,8D和8F)正在被3F取代。 3F是问号的十六进制表示。换句话说:当你工作的字符集没有表示时,所有未知字符都被转移为问号。

    更多信息可在http://www.i18nqa.com/iuc37-Texin-Critical%20values%20for%20i18n%20testing.pdf,幻灯片25上找到。

    根据本幻灯片,

    81,8D,8F,90,9D尚未分配给角色。这些正是我发现在文件字节码的十六进制中用3F替换的值。

    如果您可以在将消息转换为文本(RAW响应)之前接受消息,那么就有希望。如果响应首先保存到已经完成'损坏'的SoapUI XML项目文件中,然后检索以进行进一步操作,则无法获得正确的字节,因为它们已被3F的序列替换。

    你可以用OP的答案来做到这一点。我缩短了一点因为我只需要写入磁盘部分。如果失败了,我会在报告中看到失败的断言。