通过 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() ,建议算法:
-
获取所需文件路径,如:
def plainFile = sampler.getHTTPFiles()[0].path
- 根据服务器期望压缩文件
-
用压缩文件路径替换原始文件路径
sampler.getHTTPFiles()[0].setPath("/path/to/compressed/file.gz")
Dmitri T
2019-08-14