菜鸟笔记
提升您的技术认知

Java 文件上传同时携带参数

文件上传同时携带参数

单独进行文件上传的方式常用MultipartFile,但并不能携带其它参数:

使用MultipartHttpServletRequest可将文件、参数以键值形式包装起来,传送至controller。

例:

接口:

@RequestMapping(value = "/createTicket", method = RequestMethod.POST)
@ApiOperation(value = "新建工单", notes = "新建工单")
@ResponseBody
public CommonResultBO createTicket(MultipartHttpServletRequest request) {
  
    log.info("createTicket begin.");
    try {
  
        TicketInfo ticketInfo = getTicketInfo(request);
        ticketInfo.setStatus("已派发");
        return ticketInfoService.insertTicket(ticketInfo);
    } catch (Exception exc) {
  
        exc.printStackTrace();
        log.error("createTicket error: " + exc.getMessage());
        return CommonResultBO.init(null, -1, "createTicket failed.");
    }
}
/**
 * 功能描述 储存文件+获取工单信息类对象
 *
 * @param request 页面传参
 * @return 工单信息类对象
 */
private TicketInfo getTicketInfo(MultipartHttpServletRequest request) {
  
    String ticketInfos = request.getParameter("ticketInfos"); // 通过前后端约定的参数名获取参数,这里是json字符串
    List<MultipartFile> files = request.getFiles("file"); // 通过前后端约定的参数名获取参数,这里是文件,getFile获取单个文件,getFiles获取多														  // 个文件
    // 保存工单文件
    String path;
    path = this.readFile(files); // 文件读取
    // setFilePath
    TicketInfo ticketInfo = JSONObject.parseObject(ticketInfos, TicketInfo.class); // 将获取到的json字符串转化为业务实体类
    ticketInfo.setFilePath(path);
    return ticketInfo;
}
/**
 * 功能描述 读取文件
 *
 * @param files 文件集
 * @return 文件路径
 */
private String readFile(List<MultipartFile> files) {
  
    log.info("begin to read file.");
    List<String> paths = new ArrayList<>();
    for (MultipartFile file : files) {
  
        String path;
        try {
  
            if (file.isEmpty()) {
  
                log.info("file empty.");
            }
            // 获取文件名
            String fileName = file.getOriginalFilename();
            log.info("上传的文件名为:" + fileName);
            // 获取文件的后缀名
            String suffixName = null;
            if (fileName != null) {
  
                suffixName = fileName.substring(fileName.lastIndexOf("."));
            }
            log.info("上传的后缀名为:" + suffixName);
            // 文件上传后的路径
            String filePath = "D:\\Download\\file\\";
            path = filePath + fileName;
            File dest = new File(path);
            // 检测是否存在目录
            if (!dest.getParentFile().exists()) {
  
                dest.getParentFile().mkdirs();
            }
            // 写入文件
            file.transferTo(dest); // MultipartFile中封装了一个非常简单的方法transferTo(File file),此处只能存放绝对路径,否则会导致读取异常,
            					   // 个人还未遇到过。可以用传统方式来替换。
        } catch (IOException exception) {
  
            exception.printStackTrace();
            log.error("createTicket error, file transfer error: " + exception.getMessage());
            return null;
        }
        path = path.replace("\\", "\\\\");
        paths.add(path);
    }
    return String.join(",", paths);
}

postman请求:

参数格式以form-data形式传递。