文件上传同时携带参数
单独进行文件上传的方式常用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形式传递。