了解

       性能测试工作中,文件上传也是经常见的性能压测任务之一,之前工作中一直使用loadrunner做文件上传与下载压测,近几年开始使用Jmeter做性能测试,那么文件上传下载脚本怎么做,今天分享Jmeter文件上传与下载脚本怎么做.

知识点

  • java文件上传下载代码
  • jmeter脚本中上传与下载

java文件目录文件操作复习

先学习下java Api关于文件操作的API,这样方便咱们进一步工作

构造方法

  • File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
  • File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
  • File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
  • File(URI uri) 通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。
  • public boolean createNewFile():创建文件 如果存在这样的文件,就不创建了

创建功能

  • public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了
  • public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来

重命名和删除功能

  • public boolean renameTo(File dest):把文件重命名为指定的文件路径
  • public boolean isDirectory():判断是否是目录
  • public boolean isFile():判断是否是文件
  • public boolean exists():判断是否存在
  • public boolean canRead():判断是否可读
  • public boolean canWrite():判断是否可写
  • public boolean isHidden():判断是否隐藏

获取功能

  • public String getAbsolutePath():获取绝对路径
  • public String getPath():获取路径
  • public String getName():获取名称
  • public long length():获取长度。字节数
  • public long lastModified():获取最后一次的修改时间,毫秒值
  • public String[] list():获取指定目录下的所有文件或者文件夹的名称数组
  • public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组

创建工程

新建文件上传与下载工程代码

  • 创建后端上传代码
  • 创建后端下载代码
  • 创建前端上传与下载代码

后端下载代码




/**




* @author liwen




* @Title: FileController




* @Description: 文件操作类




* @date 2019/12/13 / 21:00




*/




@Controller




@RequestMapping("/file/")




public class FileController {




/**




* 文件上传




*




* @param fileupload 文件




* @return msg




*/




@PostMapping("fileupload")




@ResponseBody




public Msg upload(@RequestParam("fileupload") MultipartFile fileupload) {




if (fileupload.isEmpty() || fileupload.getSize() < 0) {




return Msg.fail().add("mgs", "文件为空,上传失败!");




}




// 获取文件名字




String fileName = fileupload.getOriginalFilename();




// 获取后缀名




// String suffixName = fileName.substring(fileName.lastIndexOf("."));




// 文件保存路径




String filePath = "E:\\test\\7d\\upload\\";




// 文件重命名,防止重复




fileName = filePath + UUID.randomUUID() + fileName;




// 文件对象




File dest = new File(fileName);




// 判断路径是否存在,如果不存在则创建




if (!dest.getParentFile().exists()) {




dest.getParentFile().mkdirs();




}




try {




// 保存到服务器中




fileupload.transferTo(dest);




return Msg.success().add("mgs", "文件上传成功");




} catch (Exception e) {




e.printStackTrace();




}




return Msg.fail().add("mgs", "文件上传失败");




}




/**




* 文件下载




*




* @param name 下载文件名字




* @param response 响应流




* @return mgs




* @throws Exception 异常处理




*/




@GetMapping("download")




public void download(@RequestParam("filedown") String name, HttpServletResponse response) throws Exception {




if (name.isEmpty()) {




return;




}




// 文件地址,真实环境是存放在数据库表中




File file = new File("E:\\test\\7d\\upload\\" + name);




//判断文件是否存在




if (!file.exists()) {




return;




}




// 文件对象输入流




FileInputStream fis = new FileInputStream(file);




// 设置相关格式




response.setContentType("application/force-download");




// 设置下载后的文件名以及header




response.addHeader("Content-disposition", "attachment;fileName=" + name);




// 创建输出对象




OutputStream os = response.getOutputStream();




// 常规操作




byte[] buf = new byte[1024];




int len = 0;




while ((len = fis.read(buf)) != -1) {




os.write(buf, 0, len);




}




fis.close();




return;




}




}




新建前端代码




lang="zh-CN" xmlns:th="http://www.thymeleaf.org">




charset="utf-8">




http-equiv="X-UA-Compatible" content="IE=edge">




name="viewport" content="width=device-width, initial-scale=1">




文件上传下载




name="description" content="文件上传下载">




name="author" content="liwen">




href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">







class="container">



你好,我好,大家好!







文件上传


id="fileupload" enctype='multipart/form-data'>




type='file' name='fileupload'>




type='button' class="btn btn-primary" onclick="uploadFile()">上传











文件下载


th:action="@{/file/download}" action="/file/download" method="get">




type='text' name='filedown'>




type='submit' class="btn btn-primary">下传








//文件上传




function uploadFile() {




//FormData是html5的接口,使用它一行代码便可以拿到整个form表单对象:




var form = new FormData(document.getElementById("fileupload"));




$.ajax({




url: "/file/fileupload",




type: "post",




data: form,




cache: false,




processData: false,




contentType: false,




success: function (data) {




if (data.code == 100) {




alert(data.extend.mgs);




} else {




alert(data.extend.mgs);




}




},




error: function (e) {




alert("网络错误,请重试!!");




}




});




}




运行效果

jquery post的请求下载文件 jquery 下载文件流_jquery 上传文件

Jmeter操作

-打开Jmeter并且创建线程组、http请求

文件上传:

jquery post的请求下载文件 jquery 下载文件流_jquery文件上传_02

编写关键点

jquery post的请求下载文件 jquery 下载文件流_jquery文件上传_03

注意点

jquery post的请求下载文件 jquery 下载文件流_jquery post的请求下载文件_04

验证结果:

jquery post的请求下载文件 jquery 下载文件流_jquery 文件上传_05

文件存放位置验证:

jquery post的请求下载文件 jquery 下载文件流_jquery 上传文件_06

Jmeter附件下载

jquery post的请求下载文件 jquery 下载文件流_jquery文件上传_07

编写下载位置代码

jquery post的请求下载文件 jquery 下载文件流_jquery 文件上传_08

参考代码

import java.io.*;byte[] result = prev.getResponseData();String file_name = "E:\\test\\7d\\data\\2222.ico";File file = new File(file_name);FileOutputStream out = new FileOutputStream(file);out.write(result);out.close();

总结

     上面是简单的介绍,知识点很多java文件操作,目录操作,http请求等信息,高老师经典一句《看到数据,推断什么地方有性能问题,背后的知识点需要积累多少日月》。

     送大家一句:

静中静非真静,动处静得来,才是性天之真境;乐处乐非真乐,苦中乐得来,才是心体之真机。