如何从文件中读取块以在 Jmeter 中上传?

How to read from file in chunks to upload in Jmeter?

我正在编写 Jmeter 测试计划以将文件分块上传到服务器。我对 Java.

知之甚少

我在 HTTP 请求采样器 上使用了 while controllerBean Shell 预处理器。我写了一个简短的脚本来从文件中获取字节,现在我面临的问题是:HTTP 请求采样器在文件上传部分获取文件路径。有什么方法可以在 Bean Shell 预处理器的内存中创建一个文件,然后在文件路径字段中使用该内存文件变量。

我认为理论上是可以的。因为每当我们上传一个文件时,我们都是先把它读入内存,然后再发送到服务器。那么,我们是否可以只从字节(1 MB 的块)在内存中创建一个文件,然后将其作为文件上传发送。这是我在 Bean Shell Pre-Processor

中编写的代码
Integer maxChunkSize    = new Integer(vars.get("FILE_MAX_SIZE"));
String uploadFilePath   = vars.get("UPLOAD_FILE");
uploadFileSize      = new File(uploadFilePath).length();
InputStream uploadFile  = new BufferedInputStream(new FileInputStream(uploadFilePath));
int offset      = whileCounter * maxChunkSize;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] bytes;
int size;

/* creating bytes array to hold file data*/
if (offset < uploadFileSize) {
    if (((int) offset + (int) maxChunkSize) < uploadFileSize) {
        bytes = new byte[ (int) maxChunkSize];
        size = maxChunkSize;
    } else {
        size = (int) (uploadFileSize - offset);
        bytes = new byte[ (int) size];
        vars.put("WHILE_LOOP", "0");
    }
}

/* printing results for debugging */
/*
log.info(" ============================================================== ");
log.info("While counter " + whileCounter.toString() );
log.info("While loop " + vars.get("WHILE_LOOP").toString() );
log.info("The file to upload is : " + uploadFilePath);
log.info("Maximum Chunk size is : " + maxChunkSize.toString());
log.info("Current Offset is : " + offset.toString());
log.info("The file size is " + uploadFileSize.toString());
log.info(" ============================================================== ");
*/


/* here it is giving method invocation on loop counter 2, so skip method is used */
uploadFile.skip(offset);
int bytesRead = uploadFile.read(bytes, 0, size);


/* write to byte output stream to read as a file */
bos.write(bytes, 0, bytesRead); 


/* params for next iteration */
uploadFile.close();
whileCounter++;
vars.put("WHILE_COUNTER", whileCounter.toString() );

预期:通过JMeter分块上传文件的替代方法创建一个内存变量,作为文件上传路径的文件在 JMeter HTTP 请求采样器 -> 文件上传 部分。

我不认为你可以使用 HTTP Request 采样器实现这一点,我会考虑的选项是:

  1. Implement chunked file upload using Java code 不依赖于 JMeter 的 HTTP 请求采样器,类似于

    import org.apache.http.client.methods.HttpPost
    import org.apache.http.entity.InputStreamEntity
    import org.apache.http.impl.client.CloseableHttpClient
    import org.apache.http.impl.client.HttpClients
    
    CloseableHttpClient client = HttpClients.createDefault();
    
    HttpPost post = new HttpPost("http://example.com");
    File file = new File("/path/to/your/file");
    
    InputStreamEntity reqEntity = new InputStreamEntity(new FileInputStream(file), -1, "Your file mime type");
    
    //Alternatively:
    //FileEntity reqEntity = new FileEntity(file, "Your file mime type");
    
    reqEntity.setChunked(true);
    
    client.execute(post)
    
  2. 如果需要,请转至 HTTP Raw Request sampler which simply sends chunked data over the wire (the size of the chunk is controllable via kg.apc.jmeter.samplers.FileReadChunkSize property) so you can just record the associated request body data using a sniffer tool like Wireshark and later replay it with the desired chunk size. Check out The JMeter HTTP Raw Request Sampler - When and How to Use It 文章了解更多信息。

  3. 另请注意 since JMeter 3.1 it's recommended to use JSR223 Test Elements and Groovy language for scripting,因此考虑在下一个可用机会时迁移到 Groovy。