参考:https://blog.csdn.net/qq_15674631/article/details/81095284
参考:https://www.jianshu.com/p/46e6e03a0d53 (包含了上传多个文件的方法)
总结: ajax 如果想同时发送文件和参数,那就必须用 formData 封装,如果想接收单个参数,直接key:value的形式写到data:{}里或者用formData append都可以,后端springmvc接收直接用 String xxx , int xxx ,这样接收就行了,不过参数如果多了最好用bean封装
<input type="file" id="newTemplateFileId" >
var formData = new FormData(); formData.append('file', $('#newTemplateFileId')[0].files[0]); formData.append('templatename', $('#newTemplateNameId').val()); formData.append('systype', templateName); formData.append('templatetype', templatetype); formData.append('templatejson', templateJsonContent); $.ajax({ // url:'/RM/views/test/statusJson.json', url: '/RM/controller/json/ConfigTemplateController/saveMobanContentsAndUploadUserCustomScripts', type: 'POST', cache: false, processData: false, contentType: false, data: formData, success: function (response) { if (response.status == "1") { // $('#nextStepBtnId').attr('data-toggle','modal').attr('data-target','#myModal'); alert('保存成功') }else if (response.status == "0") { alert(response.msg); } } })
@ResponseBody @RequestMapping(value = "controller/json/ConfigTemplateController/saveMobanContentsAndUploadUserCustomScripts", method = RequestMethod.POST) public BaseResult saveMobanContentsAndUploadUserCustomScripts(@Valid ConfigTemplateCustom configTemplateCustom, BindingResult result, @RequestParam(value = "file", required = false) MultipartFile file) throws IOException { if (result.hasErrors()) { Map<String, Object> map = new HashMap<>(); List<FieldError> fieldErrors = result.getFieldErrors(); for (FieldError fieldError : fieldErrors) { map.put(fieldError.getField(), fieldError.getDefaultMessage()); } return ResultUtil.error(303, "参数异常").add("errorFields", map); } else { if (configTemplateCustom.getTemplatename() == null || configTemplateCustom.getTemplatename()=="" || configTemplateCustom.getTemplatename().isEmpty()) { return ResultUtil.error(400, "请填写模板名"); } if (file == null || file.isEmpty()) { return ResultUtil.error(400, "文件为空,请上传文件后再保存模板"); } // 文件类型分拣 int fileNameLength = file.getOriginalFilename().length(); String beHandFileName = new String(file.getOriginalFilename()); String beHandSuffixName = null; String beHandedFileNameVbs = beHandFileName.substring(fileNameLength - 4, fileNameLength); String beHandedFileNameSh = beHandFileName.substring(fileNameLength - 3, fileNameLength); String beHandedFileNamePl = beHandFileName.substring(fileNameLength - 3, fileNameLength); if (!".sh".equals(beHandedFileNameSh) && !".pl".equals(beHandedFileNamePl)) { return ResultUtil.error(400, "上传的脚本类型不匹配,当前只支持类unix系列的远程扫描,请上传后缀名为 .sh .pl 的脚本文件"); } if (configTemplateCustomService.checkTemplateName(configTemplateCustom)==false){ return ResultUtil.error(400, "模板名已被使用,请填写新的模板名"); } ConfigTemplateCustom savedTemplateCustom = configTemplateCustomService.saveAfterFetchId(configTemplateCustom); // if (".vbs".equals(beHandedFileNameVbs)) { // beHandSuffixName = ".vbs"; // } if (".sh".equals(beHandedFileNameSh)) { beHandSuffixName = ".sh"; } if (".pl".equals(beHandedFileNamePl)) { beHandSuffixName = ".pl"; } File templateDir = new File("C:\RM-ROOT\upload\userCustomScripts\" + configTemplateCustom.getTemplatename()); templateDir.mkdir(); String path = "C:\RM-ROOT\upload\userCustomScripts\" + configTemplateCustom.getTemplatename(); String uploadedFileName = configTemplateCustom.getTemplatename() + beHandSuffixName; FileUtils.copyInputStreamToFile(file.getInputStream(), new File(path, uploadedFileName)); return ResultUtil.success().add("savedTemplateCustom", savedTemplateCustom); } }