开发者问题收集

通过 HTTP POST 上传包含 gzip 压缩内容的文件时出错

2019-08-08
339

我尝试使用 HTTP POST 采样器上传文件,同时压缩文件内容。为此,我在 Header Manager 中添加了 Content-Encoding:gzip,并在采样器的预处理器中添加了以下代码

import org.apache.commons.io.IOUtils;
import java.util.zip.GZIPOutputStream;


String bodyString = sampler.getArguments().getArgument(0).getValue();
byte [] requestBody = bodyString.getBytes();

ByteArrayOutputStream out = new ByteArrayOutputStream(requestBody.length);
GZIPOutputStream gzip = new GZIPOutputStream(out);
gzip.write(requestBody);
gzip.close();

sampler.getArguments().getArgument(0).setValue(out.toString(0));

这不起作用,并引发了以下异常

2019-08-07 14:08:21,970 ERROR o.a.j.m.JSR223PreProcessor: Problem in JSR223 script, JSR223 PreProcessor
javax.script.ScriptException: Sourced file: inline evaluation of: ``import org.apache.commons.io.IOUtils; import java.util.zip.GZIPOutputStream;   S . . . '' : Typed variable declaration : at Line: 5 : in file: inline evaluation of: ``import org.apache.commons.io.IOUtils; import java.util.zip.GZIPOutputStream;   S . . . '' : .getValue ( ) 

Target exception: java.lang.NullPointerException: Attempt to invoke method getValue on null value
 in inline evaluation of: ``import org.apache.commons.io.IOUtils; import java.util.zip.GZIPOutputStream;   S . . . '' at line number 5
    at bsh.engine.BshScriptEngine.evalSource(BshScriptEngine.java:87) ~[bsh-2.0b6.jar:2.0b6 2016-02-05 05:16:19]
    at bsh.engine.BshScriptEngine.eval(BshScriptEngine.java:46) ~[bsh-2.0b6.jar:2.0b6 2016-02-05 05:16:19]
    at javax.script.AbstractScriptEngine.eval(Unknown Source) ~[?:1.8.0_73]
    at org.apache.jmeter.util.JSR223TestElement.processFileOrScript(JSR223TestElement.java:225) ~[ApacheJMeter_core.jar:5.1.1 r1855137]
    at org.apache.jmeter.modifiers.JSR223PreProcessor.process(JSR223PreProcessor.java:44) [ApacheJMeter_components.jar:5.1.1 r1855137]
    at org.apache.jmeter.threads.JMeterThread.runPreProcessors(JMeterThread.java:935) [ApacheJMeter_core.jar:5.1.1 r1855137]
    at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:537) [ApacheJMeter_core.jar:5.1.1 r1855137]
    at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:486) [ApacheJMeter_core.jar:5.1.1 r1855137]
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:253) [ApacheJMeter_core.jar:5.1.1 r1855137]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_73]

现在要调试,请在 getValue 之前添加 log.info("sampler-------:"+sampler),例如

log.info("sampler-------:"+sampler);
String bodyString = sampler.getArguments().getArgument(0).getValue();

但在日志中,采样器返回空

Query Data: 

那么我应该如何在 HTTP 请求中访问文件内容并同时对其进行 gzip 压缩并发送?

2个回答

要对文件及其内容进行 gzip 压缩,请使用以下代码并将其放入 JSR223 Sampler [这应该在调用 POST API 之前],并且假设有效负载数据已复制到文件中。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;

String source_filepath = "C:/Sample/Input.txt";
String destinaton_zip_filepath = "C:/Sample/Input.gzip";

byte[] buffer = new byte[1024];

        try {

            FileOutputStream fileOutputStream =new FileOutputStream(destinaton_zip_filepath);

            GZIPOutputStream gzipOuputStream = new GZIPOutputStream(fileOutputStream);

            FileInputStream fileInput = new FileInputStream(source_filepath);

            int bytes_read;

            while ((bytes_read = fileInput.read(buffer)) > 0) {
                gzipOuputStream.write(buffer, 0, bytes_read);
            }

            fileInput.close();

            gzipOuputStream.finish();
            gzipOuputStream.close();

            } catch (IOException ex) {
            ex.printStackTrace();
        }

vars.put("ZipFileLocation",destinaton_zip_filepath);

现在可以通过 ${ZipFileLocation} 变量使用 gzip 文件。

这取决于如何调用 API,以下可能是解决方案:

  • 直接在 API 中发送此 gzip 文件
  • 声明一个变量并将所有有效负载数据保存在其中,然后调用 API -> 对它进行 gzip 压缩

注意:在适用的情况下需要使用正确的 MIME 类型和标头

SAIR
2019-08-09

如果您正在使用 JMeter 进行 文件上传 ,也就是说,您的文件是通过“文件上传”部分传递的 - 您将无法使用 getArguments() 函数获取任何内容,您需要改用 getHTTPFiles() ,建议算法:

  1. 获取所需文件路径,如:

    def plainFile = sampler.getHTTPFiles()[0].path
    
  2. 根据服务器期望压缩文件
  3. 用压缩文件路径替换原始文件路径

    sampler.getHTTPFiles()[0].setPath("/path/to/compressed/file.gz")
    
Dmitri T
2019-08-14