submit方式:

1 <form id="postForm" name="postForm" action="${rc.contextPath}/backdoor/uploadGroovy/upload" 2 enctype="multipart/form-data" method="post"> 3 <table style="font-size:14px;" class="tablelist" align="center"> 4 <th> 5 选择上传的zip: 6 </th> 7 <th><input id="file" type="file" name="file"> 8 </th> 9 <th> 10 <div> 11 <button type="button" onclick="uploadFile()">上传</button> 12 </div> 13 </th> 14 </table> 15 </form>

1 <script type="text/javascript"> 2 function uploadFile() { 3 var file = document.getElementById("file").value; 4 if (file == '') { 5 alert('请选择上传的文件!'); 6 return; 7 } 8 document.getElementById("postForm").submit(); 9 } 10 </script>
ajax方式:

1 <form id="postForm" name="postForm" action="${rc.contextPath}/backdoor/uploadGroovy/upload" 2 enctype="multipart/form-data" method="post"> 3 <table style="font-size:14px;" class="tablelist" align="center"> 4 <th> 5 选择上传的zip: 6 </th> 7 <th><input id="file" type="file" name="file"> 8 </th> 9 <th> 10 <div> 11 <button type="button" onclick="uploadFile()">上传</button> 12 </div> 13 </th> 14 </table> 15 </form>

1 <script type="text/javascript"> 2 function uploadFile() { 3 if (confirm("您确定要上传吗!")) { 4 var file = document.getElementById("file").value; 5 if (file == '') { 6 alert('请选择上传的文件!'); 7 return; 8 } 9 var fileName = $("#file").val(); 10 var fileTypes = new Array("zip"); //定义可支持的文件类型数组 11 var fileTypeFlag = "0"; 12 var newFileName = fileName.split('.'); 13 newFileName = newFileName[newFileName.length - 1]; 14 for (var i = 0; i < fileTypes.length; i++) { 15 if (fileTypes[i] == newFileName) { 16 fileTypeFlag = "1"; 17 } 18 } 19 if (fileTypeFlag == "0") { 20 alert("上传文件必须是zip格式!"); 21 return; 22 } 23 $.ajax({ 24 url: "${rc.contextPath}/backdoor/uploadGroovy/upload", 25 type: "post", 26 data: new FormData($('#postForm')[0]), 27 processData: false, 28 contentType: false, 29 success: function (data) { 30 if (data.code == 1) { 31 window.location.href = "${rc.contextPath}/backdoor/deploy/queryDeploy"; 32 } else { 33 alert(data.message); 34 } 35 } 36 }); 37 } 38 } 39 </script>
总结:使用FormData的对象进行Ajax方式上传文件。
具体用法是:使用 new FormData($('#postForm')[0]) 方式传递参数
服务端解析代码:

1 package cn.fraudmetrix.octopus.horai.web.controller; 2 3 import cn.fraudmetrix.octopus.horai.biz.service.backdoor.UploadGroovyService; 4 import cn.fraudmetrix.octopus.horai.client.Result; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.stereotype.Controller; 7 import org.springframework.web.bind.annotation.RequestMapping; 8 import org.springframework.web.bind.annotation.RequestMethod; 9 import org.springframework.web.bind.annotation.RequestParam; 10 import org.springframework.web.bind.annotation.ResponseBody; 11 import org.springframework.web.multipart.MultipartFile; 12 13 14 /** 15 * Created by hunt on 2017/7/31. 16 * 上传脚本、模板 17 */ 18 @Controller 19 @RequestMapping("uploadGroovy") 20 public class UploadGroovyController { 21 @Autowired 22 UploadGroovyService uploadGroovyService; 23 24 @ResponseBody 25 @RequestMapping(value = "upload", method = RequestMethod.POST) 26 public Object uploadZip(@RequestParam(value = "file") MultipartFile file) { 27 Result result = new Result(); 28 if (file.isEmpty()) { 29 String str = "file is empty"; 30 result.setCode(-1); 31 result.setMessage(str); 32 return result; 33 } 34 try { 35 result = uploadGroovyService.uploadZip(file); 36 } catch (Exception e) { 37 result.setCode(-1); 38 result.setMessage(e.getMessage()); 39 e.printStackTrace(); 40 } 41 return result; 42 } 43 }

1 package cn.fraudmetrix.octopus.horai.biz.service.backdoor; 2 3 import cn.fraudmetrix.octopus.horai.base.constants.ModuleConstants; 4 import cn.fraudmetrix.octopus.horai.base.constants.OperateConstants; 5 import cn.fraudmetrix.octopus.horai.biz.config.ShutterItemConfig; 6 import cn.fraudmetrix.octopus.horai.biz.utils.ListUtil; 7 import cn.fraudmetrix.octopus.horai.biz.utils.Md5Util; 8 import cn.fraudmetrix.octopus.horai.client.Result; 9 import cn.fraudmetrix.octopus.horai.dal.dao.CleanRuleDAO; 10 import cn.fraudmetrix.octopus.horai.dal.dao.ConfigDeployDAO; 11 import cn.fraudmetrix.octopus.horai.dal.dao.TemplateDAO; 12 import cn.fraudmetrix.octopus.horai.dal.po.*; 13 import com.alibaba.fastjson.JSON; 14 import org.apache.commons.io.IOUtils; 15 import org.springframework.beans.factory.annotation.Autowired; 16 import org.springframework.stereotype.Service; 17 import org.springframework.transaction.annotation.Transactional; 18 import org.springframework.util.CollectionUtils; 19 import org.springframework.web.multipart.MultipartFile; 20 21 import javax.annotation.Resource; 22 import java.io.File; 23 import java.io.IOException; 24 import java.security.NoSuchAlgorithmException; 25 import java.util.*; 26 import java.util.regex.Matcher; 27 import java.util.regex.Pattern; 28 import java.util.zip.ZipEntry; 29 import java.util.zip.ZipInputStream; 30 31 /** 32 * Created by hunt on 2017/7/31. 33 */ 34 @Service 35 public class UploadGroovyService { 36 37 @Autowired 38 private CleanRuleDAO cleanRuleDAO; 39 40 @Autowired 41 private TemplateDAO templateDAO; 42 43 @Autowired 44 private ConfigDeployDAO configDeployDAO; 45 46 @Autowired 47 private LogService logService; 48 49 @Resource 50 private ShutterItemConfig shutterItemConfig; 51 52 public Result uploadZip(MultipartFile multipartFile) throws Exception { 53 //校验是否有待加载项或者已加载但是未发布的 54 Result result = new Result(); 55 long count = configDeployDAO.queryByStatusAndEnv(); 56 if (count > 0) { 57 result.setCode(-1); 58 result.setMessage("上传失败:有待加载、未发布的数据"); 59 return result; 60 } 61 62 List<UploadGroovyDO> uploadRuleList = new ArrayList<>(); 63 List<UploadVmDO> uploadTemplateList = new ArrayList<>(); 64 Map<Integer, UploadVmDO> templateMap = new HashMap<>(); 65 ZipInputStream zipInputStream = new ZipInputStream(multipartFile.getInputStream()); 66 ZipEntry zipEntry; 67 while ((zipEntry = zipInputStream.getNextEntry()) != null) { 68 if (!zipEntry.isDirectory()) { 69 String content = IOUtils.toString(zipInputStream, "UTF-8"); 70 String entryName = zipEntry.getName(); 71 String[] entryNames = entryName.split(File.separator, 2); 72 entryName = entryNames[1]; 73 String[] names = entryName.split(File.separator); 74 UploadGroovyDO uploadGroovyDO = new UploadGroovyDO(); 75 if ("groovy".equals(names[0])) {//加载脚本 76 uploadGroovyDO.setName(names[1].split("\\.")[0]); 77 if ("groovy".equals(names[1].split("\\.")[1])) { 78 uploadGroovyDO.setContent(content); 79 uploadRuleList.add(uploadGroovyDO);//遍历之后uploadList是所有上传的脚本集合 80 } 81 } 82 if ("template".equals(names[0])) {//加载模板 83 String templateNames = names[1].split("\\.")[0]; 84 if ("vm".equals(names[1].split("\\.")[1])) { 85 String[] templateName = templateNames.split("_"); 86 int id = Integer.parseInt(templateName[0]); 87 String name = templateName[1]; 88 boolean flag = templateName.length == 3; 89 if (!templateMap.containsKey(id)) { 90 UploadVmDO newVmDO = new UploadVmDO(); 91 newVmDO.setId(id); 92 newVmDO.setName(name); 93 templateMap.put(id, newVmDO); 94 } 95 UploadVmDO vmDO = templateMap.get(id); 96 if (flag) { 97 vmDO.setReason(content); 98 } else { 99 vmDO.setContent(content); 100 } 101 } 102 } 103 } 104 } 105 106 //Map转List 107 Iterator it = templateMap.keySet().iterator(); 108 while (it.hasNext()) { 109 Integer key = (Integer) it.next(); 110 uploadTemplateList.add(templateMap.get(key)); 111 } 112 113 if (uploadRuleList.size() == 0 || uploadTemplateList.size() == 0) { 114 result.setCode(-1); 115 result.setMessage("上传失败:脚本、模板不能为空"); 116 return result; 117 } 118 119 List<UploadGroovyDO> mysqlRuleList = cleanRuleDAO.selectAllRule();//数据库中所有脚本集合 120 List<UploadVmDO> mysqlTemplateList = templateDAO.selectAllTemplate();//数据库中所有模板集合 121 122 //比较入库 123 saveRuleAndTemplate(uploadRuleList, mysqlRuleList, uploadTemplateList, mysqlTemplateList); 124 125 mysqlRuleList = cleanRuleDAO.selectAllRule();//插入后数据库中所有脚本集合 126 mysqlTemplateList = templateDAO.selectAllTemplate();//插入后数据库中所有模板集合 127 128 //上传的脚本和库中再次比较 129 if (uploadRuleList.size() != mysqlRuleList.size() || uploadTemplateList.size() != mysqlTemplateList.size()) { 130 result.setCode(-1); 131 result.setMessage("上传失败:上传脚本、模板和数据库中个数不一致"); 132 return result; 133 } 134 //对list排序 135 Collections.sort(uploadRuleList); 136 Collections.sort(mysqlRuleList); 137 Collections.sort(uploadTemplateList); 138 Collections.sort(mysqlTemplateList); 139 140 for (int i = 0; i < uploadRuleList.size(); i++) { 141 if (!compareMd5(uploadRuleList.get(i).getContent(), mysqlRuleList.get(i).getContent())) { 142 result.setCode(-1); 143 result.setMessage("上传失败:上传脚本和数据库中内容不一致"); 144 return result; 145 } 146 } 147 148 for (int i = 0; i < uploadTemplateList.size(); i++) { 149 if (!compareMd5(uploadTemplateList.get(i).getContent() + uploadTemplateList.get(i).getReason(), 150 mysqlTemplateList.get(i).getContent() + mysqlTemplateList.get(i).getReason())) { 151 result.setCode(-1); 152 result.setMessage("上传失败:上传模板和数据库中内容不一致"); 153 return result; 154 } 155 } 156 157 result.setCode(1); 158 result.setMessage("success"); 159 return result; 160 } 161 162 @Transactional 163 private void saveRuleAndTemplate(List<UploadGroovyDO> uploadRuleList, List<UploadGroovyDO> mysqlRuleList, 164 List<UploadVmDO> uploadTemplateList, List<UploadVmDO> mysqlTemplateList) throws Exception { 165 166 //是否还有编辑项 167 List<ConfigDeploy> configDeployList = configDeployDAO.queryByStatus(); 168 int nextVersion = (int) configDeployDAO.nextVersion(); 169 if (!CollectionUtils.isEmpty(configDeployList)) { 170 //删除编辑的记录 171 configDeployDAO.batchDeleteConfigDeploy(configDeployList); 172 } 173 174 //插入发布记录 175 ConfigDeploy configDeploy = new ConfigDeploy(); 176 configDeploy.setVersion(nextVersion); 177 configDeploy.setDeployStatus((short) 0); 178 configDeploy.setBakStatus((short) 0); 179 configDeploy.setDeployType((short) 0); 180 configDeploy.setEnv(shutterItemConfig.getEnv()); 181 configDeployDAO.insertSelective(configDeploy); 182 183 //比较上传脚本和数据库中脚本的情况 184 //新增情况 185 List<UploadGroovyDO> addRuleList = ListUtil.diff(uploadRuleList, mysqlRuleList); 186 //删除情况 187 List<UploadGroovyDO> deleteRuleList = ListUtil.diff(mysqlRuleList, uploadRuleList); 188 //修改情况 189 List<UploadGroovyDO> commonUploadRuleList = ListUtil.intersect(uploadRuleList, mysqlRuleList);//返回的是upload集合 190 List<UploadGroovyDO> commonMysqlRuleList = ListUtil.intersect(mysqlRuleList, uploadRuleList);//返回的是mysql集合 191 192 //对list排序 193 Collections.sort(commonUploadRuleList); 194 Collections.sort(commonMysqlRuleList); 195 196 List<UploadGroovyDO> updateRuleList = new ArrayList<>(); 197 for (int i = 0; i < commonUploadRuleList.size(); i++) { 198 boolean flag = compareMd5(commonUploadRuleList.get(i).getContent(), commonMysqlRuleList.get(i).getContent()); 199 if (!flag) { 200 updateRuleList.add(commonUploadRuleList.get(i)); 201 } 202 } 203 //批量新增addRuleList 204 if (addRuleList != null && addRuleList.size() > 0) { 205 List<CleanRule> batchInsertRules = new ArrayList<>(addRuleList.size()); 206 batchInsertRules = convertBeanC(batchInsertRules, addRuleList); 207 cleanRuleDAO.batchInsertRules(batchInsertRules); 208 //操作日志接口 209 String[] ruleNames = new String[batchInsertRules.size()]; 210 for (int i = 0; i < batchInsertRules.size(); i++) { 211 ruleNames[i] = batchInsertRules.get(i).getRuleName(); 212 } 213 logService.saveLog(ModuleConstants.DEPLOY, OperateConstants.ADD + JSON.toJSONString(ruleNames), false); 214 } 215 216 217 //批量删除deleteRuleList 218 if (deleteRuleList != null && deleteRuleList.size() > 0) { 219 List<CleanRule> batchDeleteRules = new ArrayList<>(deleteRuleList.size()); 220 batchDeleteRules = convertBeanC(batchDeleteRules, deleteRuleList); 221 cleanRuleDAO.batchDeleteRules(batchDeleteRules); 222 //操作日志接口 223 String[] ruleNames = new String[batchDeleteRules.size()]; 224 for (int i = 0; i < batchDeleteRules.size(); i++) { 225 ruleNames[i] = batchDeleteRules.get(i).getRuleName(); 226 } 227 logService.saveLog(ModuleConstants.DEPLOY, OperateConstants.DELETE + JSON.toJSONString(ruleNames), false); 228 } 229 230 231 //修改updateRuleList 232 if (updateRuleList != null && updateRuleList.size() > 0) { 233 List<CleanRule> batchUpdateRules = new ArrayList<>(updateRuleList.size()); 234 batchUpdateRules = convertBeanC(batchUpdateRules, updateRuleList); 235 String[] ruleNames = new String[batchUpdateRules.size()]; 236 for (int i = 0; i < batchUpdateRules.size(); i++) { 237 cleanRuleDAO.updateByName(batchUpdateRules.get(i)); 238 ruleNames[i] = batchUpdateRules.get(i).getRuleName(); 239 } 240 logService.saveLog(ModuleConstants.DEPLOY, OperateConstants.UPDATE + JSON.toJSONString(ruleNames), false); 241 } 242 243 244 //比较上传模板和数据库中模板的情况 245 //新增情况 246 List<UploadVmDO> addTemplateList = ListUtil.diff(uploadTemplateList, mysqlTemplateList); 247 //删除情况 248 List<UploadVmDO> deleteTemplateList = ListUtil.diff(mysqlTemplateList, uploadTemplateList); 249 //修改情况 250 List<UploadVmDO> commonUploadTemplateRuleList = ListUtil.intersect(uploadTemplateList, mysqlTemplateList);//返回的是upload集合 251 List<UploadVmDO> commonMysqlTemplateList = ListUtil.intersect(mysqlTemplateList, uploadTemplateList);//返回的是mysql集合 252 253 //对list排序 254 Collections.sort(commonUploadTemplateRuleList); 255 Collections.sort(commonMysqlTemplateList); 256 257 List<UploadVmDO> updateTemplateList = new ArrayList<>(); 258 for (int i = 0; i < commonUploadTemplateRuleList.size(); i++) { 259 boolean flag = compareMd5(commonUploadTemplateRuleList.get(i).getContent() + commonUploadTemplateRuleList.get(i).getReason(), 260 commonMysqlTemplateList.get(i).getContent() + commonMysqlTemplateList.get(i).getReason()); 261 if (!flag) { 262 updateTemplateList.add(commonUploadTemplateRuleList.get(i)); 263 } 264 } 265 //批量新增addTemplateList 266 if (addTemplateList != null && addTemplateList.size() > 0) { 267 List<TemplateDO> batchInsertTemplates = new ArrayList<>(addTemplateList.size()); 268 batchInsertTemplates = convertBeanT(batchInsertTemplates, addTemplateList); 269 templateDAO.batchInsertTemplates(batchInsertTemplates); 270 //操作日志接口 271 String[] templateNames = new String[batchInsertTemplates.size()]; 272 for (int i = 0; i < batchInsertTemplates.size(); i++) { 273 templateNames[i] = batchInsertTemplates.get(i).getName(); 274 } 275 logService.saveLog(ModuleConstants.DEPLOY, OperateConstants.ADD + JSON.toJSONString(templateNames), false); 276 } 277 278 279 //批量删除deleteTemplateList 280 if (deleteTemplateList != null && deleteTemplateList.size() > 0) { 281 List<TemplateDO> batchDeleteTemplates = new ArrayList<>(deleteTemplateList.size()); 282 batchDeleteTemplates = convertBeanT(batchDeleteTemplates, deleteTemplateList); 283 templateDAO.batchDeleteTemplates(batchDeleteTemplates); 284 //操作日志接口 285 String[] templateNames = new String[batchDeleteTemplates.size()]; 286 for (int i = 0; i < batchDeleteTemplates.size(); i++) { 287 templateNames[i] = batchDeleteTemplates.get(i).getName(); 288 } 289 logService.saveLog(ModuleConstants.DEPLOY, OperateConstants.DELETE + JSON.toJSONString(templateNames), false); 290 } 291 292 //修改updateTemplateList 293 if (updateTemplateList != null && updateTemplateList.size() > 0) { 294 List<TemplateDO> batchUpdateTemplates = new ArrayList<>(updateTemplateList.size()); 295 batchUpdateTemplates = convertBeanT(batchUpdateTemplates, updateTemplateList); 296 String[] templateNames = new String[batchUpdateTemplates.size()]; 297 for (int i = 0; i < batchUpdateTemplates.size(); i++) { 298 templateDAO.updateByName(batchUpdateTemplates.get(i)); 299 templateNames[i] = batchUpdateTemplates.get(i).getName(); 300 } 301 logService.saveLog(ModuleConstants.DEPLOY, OperateConstants.UPDATE + JSON.toJSONString(templateNames), false); 302 } 303 304 305 } 306 307 /** 308 * 比较MD5值 309 * 310 * @param string1 311 * @param string2 312 * @return 313 * @throws NoSuchAlgorithmException 314 */ 315 private boolean compareMd5(String string1, String string2) throws NoSuchAlgorithmException { 316 if (Md5Util.getMd5(string1).equals(Md5Util.getMd5(string2))) { 317 return true; 318 } else { 319 return false; 320 } 321 } 322 323 /** 324 * UploadGroovyDO转换成CleanRule 325 * 326 * @param list1 327 * @param list2 328 * @return 329 */ 330 private List<CleanRule> convertBeanC(List<CleanRule> list1, List<UploadGroovyDO> list2) { 331 for (UploadGroovyDO uploadGroovyDO : list2) { 332 CleanRule cleanRule = new CleanRule(); 333 cleanRule.setRuleName(uploadGroovyDO.getName()); 334 cleanRule.setRuleContent(uploadGroovyDO.getContent()); 335 cleanRule.setDescrib(getDescrib(uploadGroovyDO.getContent())); 336 cleanRule.setGmtCreate(new Date()); 337 list1.add(cleanRule); 338 } 339 return list1; 340 } 341 342 /** 343 * UploadGroovyDO转换成TemplateDO 344 * 345 * @param list1 346 * @param list2 347 * @return 348 */ 349 private List<TemplateDO> convertBeanT(List<TemplateDO> list1, List<UploadVmDO> list2) { 350 for (UploadVmDO uploadVmDO : list2) { 351 TemplateDO templateDO = new TemplateDO(); 352 templateDO.setTemplateId(uploadVmDO.getId()); 353 templateDO.setName(uploadVmDO.getName()); 354 templateDO.setTemplateData(uploadVmDO.getContent()); 355 templateDO.setTemplateReason(uploadVmDO.getReason()); 356 templateDO.setGmtCreate(new Date()); 357 list1.add(templateDO); 358 } 359 return list1; 360 } 361 362 /** 363 * 获取描述内容 364 * 365 * @param string 366 * @return 367 */ 368 private String getDescrib(String string) { 369 Pattern regexDecrement = Pattern.compile("describ:([\\s\\S]*)###");//([\s\S]*)完全通配 370 Matcher matcher = regexDecrement.matcher(string); 371 if (matcher.find()) { 372 return matcher.group(1); 373 } 374 return null; 375 } 376 377 378 }
外部拓展:SpringMVC上传文件的三种方式