文件上传submit、ajax方式
submit方式:
<form id="postForm" name="postForm" action="${rc.contextPath}/backdoor/uploadGroovy/upload"
enctype="multipart/form-data" method="post">
<table style="font-size:14px;" class="tablelist" align="center">
<th>
选择上传的zip:
</th>
<th><input id="file" type="file" name="file">
</th>
<th>
<div>
<button type="button" onclick="uploadFile()">上传</button>
</div>
</th>
</table>
</form>
<script type="text/javascript">
function uploadFile() {
var file = document.getElementById("file").value;
if (file == '') {
alert('请选择上传的文件!');
return;
}
document.getElementById("postForm").submit();
}
</script>
ajax方式:
<form id="postForm" name="postForm" action="${rc.contextPath}/backdoor/uploadGroovy/upload"
enctype="multipart/form-data" method="post">
<table style="font-size:14px;" class="tablelist" align="center">
<th>
选择上传的zip:
</th>
<th><input id="file" type="file" name="file">
</th>
<th>
<div>
<button type="button" onclick="uploadFile()">上传</button>
</div>
</th>
</table>
</form>
<script type="text/javascript">
function uploadFile() {
if (confirm("您确定要上传吗!")) {
var file = document.getElementById("file").value;
if (file == '') {
alert('请选择上传的文件!');
return;
}
var fileName = $("#file").val();
var fileTypes = new Array("zip"); //定义可支持的文件类型数组
var fileTypeFlag = "0";
var newFileName = fileName.split('.');
newFileName = newFileName[newFileName.length - 1];
for (var i = 0; i < fileTypes.length; i++) {
if (fileTypes[i] == newFileName) {
fileTypeFlag = "1";
}
}
if (fileTypeFlag == "0") {
alert("上传文件必须是zip格式!");
return;
}
$.ajax({
url: "${rc.contextPath}/backdoor/uploadGroovy/upload",
type: "post",
data: new FormData($('#postForm')[0]),
processData: false,
contentType: false,
success: function (data) {
if (data.code == 1) {
window.location.href = "${rc.contextPath}/backdoor/deploy/queryDeploy";
} else {
alert(data.message);
}
}
});
}
}
</script>
总结:使用FormData的对象进行Ajax方式上传文件。
具体用法是:使用 new FormData($('#postForm')[0]) 方式传递参数
服务端解析代码:
package cn.fraudmetrix.octopus.horai.web.controller; import cn.fraudmetrix.octopus.horai.biz.service.backdoor.UploadGroovyService;
import cn.fraudmetrix.octopus.horai.client.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile; /**
* Created by hunt on 2017/7/31.
* 上传脚本、模板
*/
@Controller
@RequestMapping("uploadGroovy")
public class UploadGroovyController {
@Autowired
UploadGroovyService uploadGroovyService; @ResponseBody
@RequestMapping(value = "upload", method = RequestMethod.POST)
public Object uploadZip(@RequestParam(value = "file") MultipartFile file) {
Result result = new Result();
if (file.isEmpty()) {
String str = "file is empty";
result.setCode(-1);
result.setMessage(str);
return result;
}
try {
result = uploadGroovyService.uploadZip(file);
} catch (Exception e) {
result.setCode(-1);
result.setMessage(e.getMessage());
e.printStackTrace();
}
return result;
}
}
package cn.fraudmetrix.octopus.horai.biz.service.backdoor; import cn.fraudmetrix.octopus.horai.base.constants.ModuleConstants;
import cn.fraudmetrix.octopus.horai.base.constants.OperateConstants;
import cn.fraudmetrix.octopus.horai.biz.config.ShutterItemConfig;
import cn.fraudmetrix.octopus.horai.biz.utils.ListUtil;
import cn.fraudmetrix.octopus.horai.biz.utils.Md5Util;
import cn.fraudmetrix.octopus.horai.client.Result;
import cn.fraudmetrix.octopus.horai.dal.dao.CleanRuleDAO;
import cn.fraudmetrix.octopus.horai.dal.dao.ConfigDeployDAO;
import cn.fraudmetrix.octopus.horai.dal.dao.TemplateDAO;
import cn.fraudmetrix.octopus.horai.dal.po.*;
import com.alibaba.fastjson.JSON;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream; /**
* Created by hunt on 2017/7/31.
*/
@Service
public class UploadGroovyService { @Autowired
private CleanRuleDAO cleanRuleDAO; @Autowired
private TemplateDAO templateDAO; @Autowired
private ConfigDeployDAO configDeployDAO; @Autowired
private LogService logService; @Resource
private ShutterItemConfig shutterItemConfig; public Result uploadZip(MultipartFile multipartFile) throws Exception {
//校验是否有待加载项或者已加载但是未发布的
Result result = new Result();
long count = configDeployDAO.queryByStatusAndEnv();
if (count > 0) {
result.setCode(-1);
result.setMessage("上传失败:有待加载、未发布的数据");
return result;
} List<UploadGroovyDO> uploadRuleList = new ArrayList<>();
List<UploadVmDO> uploadTemplateList = new ArrayList<>();
Map<Integer, UploadVmDO> templateMap = new HashMap<>();
ZipInputStream zipInputStream = new ZipInputStream(multipartFile.getInputStream());
ZipEntry zipEntry;
while ((zipEntry = zipInputStream.getNextEntry()) != null) {
if (!zipEntry.isDirectory()) {
String content = IOUtils.toString(zipInputStream, "UTF-8");
String entryName = zipEntry.getName();
String[] entryNames = entryName.split(File.separator, 2);
entryName = entryNames[1];
String[] names = entryName.split(File.separator);
UploadGroovyDO uploadGroovyDO = new UploadGroovyDO();
if ("groovy".equals(names[0])) {//加载脚本
uploadGroovyDO.setName(names[1].split("\\.")[0]);
if ("groovy".equals(names[1].split("\\.")[1])) {
uploadGroovyDO.setContent(content);
uploadRuleList.add(uploadGroovyDO);//遍历之后uploadList是所有上传的脚本集合
}
}
if ("template".equals(names[0])) {//加载模板
String templateNames = names[1].split("\\.")[0];
if ("vm".equals(names[1].split("\\.")[1])) {
String[] templateName = templateNames.split("_");
int id = Integer.parseInt(templateName[0]);
String name = templateName[1];
boolean flag = templateName.length == 3;
if (!templateMap.containsKey(id)) {
UploadVmDO newVmDO = new UploadVmDO();
newVmDO.setId(id);
newVmDO.setName(name);
templateMap.put(id, newVmDO);
}
UploadVmDO vmDO = templateMap.get(id);
if (flag) {
vmDO.setReason(content);
} else {
vmDO.setContent(content);
}
}
}
}
} //Map转List
Iterator it = templateMap.keySet().iterator();
while (it.hasNext()) {
Integer key = (Integer) it.next();
uploadTemplateList.add(templateMap.get(key));
} if (uploadRuleList.size() == 0 || uploadTemplateList.size() == 0) {
result.setCode(-1);
result.setMessage("上传失败:脚本、模板不能为空");
return result;
} List<UploadGroovyDO> mysqlRuleList = cleanRuleDAO.selectAllRule();//数据库中所有脚本集合
List<UploadVmDO> mysqlTemplateList = templateDAO.selectAllTemplate();//数据库中所有模板集合 //比较入库
saveRuleAndTemplate(uploadRuleList, mysqlRuleList, uploadTemplateList, mysqlTemplateList); mysqlRuleList = cleanRuleDAO.selectAllRule();//插入后数据库中所有脚本集合
mysqlTemplateList = templateDAO.selectAllTemplate();//插入后数据库中所有模板集合 //上传的脚本和库中再次比较
if (uploadRuleList.size() != mysqlRuleList.size() || uploadTemplateList.size() != mysqlTemplateList.size()) {
result.setCode(-1);
result.setMessage("上传失败:上传脚本、模板和数据库中个数不一致");
return result;
}
//对list排序
Collections.sort(uploadRuleList);
Collections.sort(mysqlRuleList);
Collections.sort(uploadTemplateList);
Collections.sort(mysqlTemplateList); for (int i = 0; i < uploadRuleList.size(); i++) {
if (!compareMd5(uploadRuleList.get(i).getContent(), mysqlRuleList.get(i).getContent())) {
result.setCode(-1);
result.setMessage("上传失败:上传脚本和数据库中内容不一致");
return result;
}
} for (int i = 0; i < uploadTemplateList.size(); i++) {
if (!compareMd5(uploadTemplateList.get(i).getContent() + uploadTemplateList.get(i).getReason(),
mysqlTemplateList.get(i).getContent() + mysqlTemplateList.get(i).getReason())) {
result.setCode(-1);
result.setMessage("上传失败:上传模板和数据库中内容不一致");
return result;
}
} result.setCode(1);
result.setMessage("success");
return result;
} @Transactional
private void saveRuleAndTemplate(List<UploadGroovyDO> uploadRuleList, List<UploadGroovyDO> mysqlRuleList,
List<UploadVmDO> uploadTemplateList, List<UploadVmDO> mysqlTemplateList) throws Exception { //是否还有编辑项
List<ConfigDeploy> configDeployList = configDeployDAO.queryByStatus();
int nextVersion = (int) configDeployDAO.nextVersion();
if (!CollectionUtils.isEmpty(configDeployList)) {
//删除编辑的记录
configDeployDAO.batchDeleteConfigDeploy(configDeployList);
} //插入发布记录
ConfigDeploy configDeploy = new ConfigDeploy();
configDeploy.setVersion(nextVersion);
configDeploy.setDeployStatus((short) 0);
configDeploy.setBakStatus((short) 0);
configDeploy.setDeployType((short) 0);
configDeploy.setEnv(shutterItemConfig.getEnv());
configDeployDAO.insertSelective(configDeploy); //比较上传脚本和数据库中脚本的情况
//新增情况
List<UploadGroovyDO> addRuleList = ListUtil.diff(uploadRuleList, mysqlRuleList);
//删除情况
List<UploadGroovyDO> deleteRuleList = ListUtil.diff(mysqlRuleList, uploadRuleList);
//修改情况
List<UploadGroovyDO> commonUploadRuleList = ListUtil.intersect(uploadRuleList, mysqlRuleList);//返回的是upload集合
List<UploadGroovyDO> commonMysqlRuleList = ListUtil.intersect(mysqlRuleList, uploadRuleList);//返回的是mysql集合 //对list排序
Collections.sort(commonUploadRuleList);
Collections.sort(commonMysqlRuleList); List<UploadGroovyDO> updateRuleList = new ArrayList<>();
for (int i = 0; i < commonUploadRuleList.size(); i++) {
boolean flag = compareMd5(commonUploadRuleList.get(i).getContent(), commonMysqlRuleList.get(i).getContent());
if (!flag) {
updateRuleList.add(commonUploadRuleList.get(i));
}
}
//批量新增addRuleList
if (addRuleList != null && addRuleList.size() > 0) {
List<CleanRule> batchInsertRules = new ArrayList<>(addRuleList.size());
batchInsertRules = convertBeanC(batchInsertRules, addRuleList);
cleanRuleDAO.batchInsertRules(batchInsertRules);
//操作日志接口
String[] ruleNames = new String[batchInsertRules.size()];
for (int i = 0; i < batchInsertRules.size(); i++) {
ruleNames[i] = batchInsertRules.get(i).getRuleName();
}
logService.saveLog(ModuleConstants.DEPLOY, OperateConstants.ADD + JSON.toJSONString(ruleNames), false);
} //批量删除deleteRuleList
if (deleteRuleList != null && deleteRuleList.size() > 0) {
List<CleanRule> batchDeleteRules = new ArrayList<>(deleteRuleList.size());
batchDeleteRules = convertBeanC(batchDeleteRules, deleteRuleList);
cleanRuleDAO.batchDeleteRules(batchDeleteRules);
//操作日志接口
String[] ruleNames = new String[batchDeleteRules.size()];
for (int i = 0; i < batchDeleteRules.size(); i++) {
ruleNames[i] = batchDeleteRules.get(i).getRuleName();
}
logService.saveLog(ModuleConstants.DEPLOY, OperateConstants.DELETE + JSON.toJSONString(ruleNames), false);
} //修改updateRuleList
if (updateRuleList != null && updateRuleList.size() > 0) {
List<CleanRule> batchUpdateRules = new ArrayList<>(updateRuleList.size());
batchUpdateRules = convertBeanC(batchUpdateRules, updateRuleList);
String[] ruleNames = new String[batchUpdateRules.size()];
for (int i = 0; i < batchUpdateRules.size(); i++) {
cleanRuleDAO.updateByName(batchUpdateRules.get(i));
ruleNames[i] = batchUpdateRules.get(i).getRuleName();
}
logService.saveLog(ModuleConstants.DEPLOY, OperateConstants.UPDATE + JSON.toJSONString(ruleNames), false);
} //比较上传模板和数据库中模板的情况
//新增情况
List<UploadVmDO> addTemplateList = ListUtil.diff(uploadTemplateList, mysqlTemplateList);
//删除情况
List<UploadVmDO> deleteTemplateList = ListUtil.diff(mysqlTemplateList, uploadTemplateList);
//修改情况
List<UploadVmDO> commonUploadTemplateRuleList = ListUtil.intersect(uploadTemplateList, mysqlTemplateList);//返回的是upload集合
List<UploadVmDO> commonMysqlTemplateList = ListUtil.intersect(mysqlTemplateList, uploadTemplateList);//返回的是mysql集合 //对list排序
Collections.sort(commonUploadTemplateRuleList);
Collections.sort(commonMysqlTemplateList); List<UploadVmDO> updateTemplateList = new ArrayList<>();
for (int i = 0; i < commonUploadTemplateRuleList.size(); i++) {
boolean flag = compareMd5(commonUploadTemplateRuleList.get(i).getContent() + commonUploadTemplateRuleList.get(i).getReason(),
commonMysqlTemplateList.get(i).getContent() + commonMysqlTemplateList.get(i).getReason());
if (!flag) {
updateTemplateList.add(commonUploadTemplateRuleList.get(i));
}
}
//批量新增addTemplateList
if (addTemplateList != null && addTemplateList.size() > 0) {
List<TemplateDO> batchInsertTemplates = new ArrayList<>(addTemplateList.size());
batchInsertTemplates = convertBeanT(batchInsertTemplates, addTemplateList);
templateDAO.batchInsertTemplates(batchInsertTemplates);
//操作日志接口
String[] templateNames = new String[batchInsertTemplates.size()];
for (int i = 0; i < batchInsertTemplates.size(); i++) {
templateNames[i] = batchInsertTemplates.get(i).getName();
}
logService.saveLog(ModuleConstants.DEPLOY, OperateConstants.ADD + JSON.toJSONString(templateNames), false);
} //批量删除deleteTemplateList
if (deleteTemplateList != null && deleteTemplateList.size() > 0) {
List<TemplateDO> batchDeleteTemplates = new ArrayList<>(deleteTemplateList.size());
batchDeleteTemplates = convertBeanT(batchDeleteTemplates, deleteTemplateList);
templateDAO.batchDeleteTemplates(batchDeleteTemplates);
//操作日志接口
String[] templateNames = new String[batchDeleteTemplates.size()];
for (int i = 0; i < batchDeleteTemplates.size(); i++) {
templateNames[i] = batchDeleteTemplates.get(i).getName();
}
logService.saveLog(ModuleConstants.DEPLOY, OperateConstants.DELETE + JSON.toJSONString(templateNames), false);
} //修改updateTemplateList
if (updateTemplateList != null && updateTemplateList.size() > 0) {
List<TemplateDO> batchUpdateTemplates = new ArrayList<>(updateTemplateList.size());
batchUpdateTemplates = convertBeanT(batchUpdateTemplates, updateTemplateList);
String[] templateNames = new String[batchUpdateTemplates.size()];
for (int i = 0; i < batchUpdateTemplates.size(); i++) {
templateDAO.updateByName(batchUpdateTemplates.get(i));
templateNames[i] = batchUpdateTemplates.get(i).getName();
}
logService.saveLog(ModuleConstants.DEPLOY, OperateConstants.UPDATE + JSON.toJSONString(templateNames), false);
} } /**
* 比较MD5值
*
* @param string1
* @param string2
* @return
* @throws NoSuchAlgorithmException
*/
private boolean compareMd5(String string1, String string2) throws NoSuchAlgorithmException {
if (Md5Util.getMd5(string1).equals(Md5Util.getMd5(string2))) {
return true;
} else {
return false;
}
} /**
* UploadGroovyDO转换成CleanRule
*
* @param list1
* @param list2
* @return
*/
private List<CleanRule> convertBeanC(List<CleanRule> list1, List<UploadGroovyDO> list2) {
for (UploadGroovyDO uploadGroovyDO : list2) {
CleanRule cleanRule = new CleanRule();
cleanRule.setRuleName(uploadGroovyDO.getName());
cleanRule.setRuleContent(uploadGroovyDO.getContent());
cleanRule.setDescrib(getDescrib(uploadGroovyDO.getContent()));
cleanRule.setGmtCreate(new Date());
list1.add(cleanRule);
}
return list1;
} /**
* UploadGroovyDO转换成TemplateDO
*
* @param list1
* @param list2
* @return
*/
private List<TemplateDO> convertBeanT(List<TemplateDO> list1, List<UploadVmDO> list2) {
for (UploadVmDO uploadVmDO : list2) {
TemplateDO templateDO = new TemplateDO();
templateDO.setTemplateId(uploadVmDO.getId());
templateDO.setName(uploadVmDO.getName());
templateDO.setTemplateData(uploadVmDO.getContent());
templateDO.setTemplateReason(uploadVmDO.getReason());
templateDO.setGmtCreate(new Date());
list1.add(templateDO);
}
return list1;
} /**
* 获取描述内容
*
* @param string
* @return
*/
private String getDescrib(String string) {
Pattern regexDecrement = Pattern.compile("describ:([\\s\\S]*)###");//([\s\S]*)完全通配
Matcher matcher = regexDecrement.matcher(string);
if (matcher.find()) {
return matcher.group(1);
}
return null;
} }
外部拓展:SpringMVC上传文件的三种方式
文件上传submit、ajax方式的更多相关文章
- maven工程 java 实现文件上传 SSM ajax异步请求上传
java ssm框架实现文件上传 实现:单文件上传.多文件上传(单选和多选),并且用 ajax 异步刷新,在当前界面显示上传的文件 首先springmvc的配置文件要配置上传文件解析器: <!- ...
- 利用struts2进行单个文件,批量文件上传,ajax异步上传以及下载
利用struts2进行单个文件,批量文件上传,ajax异步上传以及下载 1.页面显示代码 <%@ page language="java" import="java ...
- ajax 文件上传,ajax
ajax 文件上传,ajax 啥也不说了,直接上代码! <input type="file" id="file" name="myfile&qu ...
- django设置并获取cookie/session,文件上传,ajax接收文件,post/get请求及跨域请求等的方法
django设置并获取cookie/session,文件上传,ajax接收文件等的方法: views.py文件: from django.shortcuts import render,HttpRes ...
- ajax异步文件上传,iframe方式
不是我写的,我看了他的,思路很明确: 实现思路: 在js脚本中动态创建form,动态创建form中的内容,将文件上传的内容以隐藏域的方式提交过去,然后写好回调等. 感觉思路不难,但是我写不出来,感觉需 ...
- 关于文件上传的ajax交互
首先我们来了解一下上传文件 <input type="file"> input的file常用上传类型 后缀名 MIME名称 *.3gpp audio/3gpp, vid ...
- Django文件上传三种方式以及简单预览功能
主要内容: 一.文件长传的三种方式 二.简单预览功能实现 一.form表单上传 1.页面代码 <!DOCTYPE html> <html lang="en"> ...
- Python Django缓存,信号,序列化,文件上传,Ajax登录和csrf_token验证
本节内容 models操作 Django的缓存 请求方式 序列化 Form 配合Ajax实现登录认证 上传文件 Ajax csrf_token验证方式 1 models操作 单表查询: curd(增 ...
- 表单文件上传,ajax文件上传
原创链接:http://www.cnblogs.com/yanqin/p/5345562.html html代码 index.jsp(表单文件上传) <form action="sh ...
- SpringMVC(四)-- springmvc的系统学习之文件上传、ajax&json处理
资源:尚学堂 邹波 springmvc框架视频 一.文件上传 1.步骤: (1)导入jar包 commons-fileupload,commons-io (2)在springmvc的配置文件中配置解析 ...
随机推荐
- 笛卡尔遗传规划Cartesian Genetic Programming (CGP)简单理解(1)
初识遗传算法Genetic Algorithm(GA) 遗传算法是计算数学中用于解决最优化的搜索算法,是进化算法的一种.进化算法借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传.突变.自然选 ...
- HyperLedger Fabric 学习思路分享
HyperLedger Fabric 学习思路分享 HyperLedger Fabric最初是由Digital Asset和IBM公司贡献的.由Linux基金会主办的一个超级账本项目,它是一个目前非常 ...
- PAT甲题题解-1031. Hello World for U (20)-字符串处理,水
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h&g ...
- Daily Scrum 10.22
(写于10.22周四0晨) 昨天任务还未完成的继续完成任务. 每个人都查看自己的TFS,修改已经完成的任务状态,改为已关闭-已完成. 由于android studio运行过于慢,我们统一采取eclip ...
- ubuntu18.04配置nvidia docker和远程连接ssh+远程桌面连接(三)
ubuntu18.04配置nvidia docker和远程连接ssh+远程桌面连接(三) 本教程适用于想要在远程服务器上配置docker图形界面用于深度学习的用户. (三)配置远程桌面连接访问dock ...
- beta 圆桌 6
031602111 傅海涛 1.今天进展 接口微调修正 2.存在问题 文档转化太久 3.明天安排 完成全部接口的交互 4.心得体会 文档转化需要好好优化 031602115 黄家雄 1.界面优化 2. ...
- Linux 文件系统介绍
目录 1.Linux 分区简介 2.文件的类型 3.文件的属性与权限 4.直达底部 一.Linux 分区简介 与 windows 通过 盘符管理各个分区不同,Linux把所有设备和文件都当作文件来管理 ...
- 【Vue学习笔记1】全局配置 Vue.config
1.slient 类型:boolean: 默认:false: 用法:Vue.config.silent = true 用于取消 Vue 所有的日志与警告
- #LOJ2564 SDOI2018 原题识别 主席树
转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/9057297.html 原题链接: 今天考试考了前天的SDOI考题 天啊我菜爆,只有T2拿了30分 然后考试后半 ...
- 【题解】 Codeforces 919F A Game With Numbers(拓扑排序+博弈论+哈希)
懒得复制,戳我戳我 Solution: 我感觉我也说不太好,看Awson的题解吧. 说一点之前打错的地方: 连边存的是hash后的数组下标 if(ans[ num( C[a.hash()] , C[b ...