文件上传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的配置文件中配置解析 ...
随机推荐
- Alpha版本总结
Alpha版本总结 General Questions a) What went well? Why? 成功之处:界面设计简洁,功能吸引用户. 原因:铁道大学学生上自习不方便,没有固定的教室 ...
- (转)广度优先搜索BFS和深度优先搜索DFS
1. 广度优先搜索介绍 广度优先搜索算法(Breadth First Search),又称为"宽度优先搜索"或"横向优先搜索",简称BFS. 它的思想是:从图中 ...
- 101空降师506团2营E连全体成员
吕天一 https://coding.net/u/Richardlv http://www.cnblogs.com/Richardlv/ 李伟亮 https://coding.net/u/201304 ...
- Jmeter使用笔记之意料之外的
以下是在测试过程中按照以前loadrunner的思维来做的一点区别: 一.组织方式之setup 在用loadrunner做接口测试的时候如果不是针对login的测试,那么一般也会把login接口放到i ...
- array_column 函数, 以及在PHP5.5之下的替代方法
array_column 函数, 是能够根据多维数组中共有的一个键值来提取多维数组中属于这个键的值 例如下面的数组: $test = array( 0 => array( 'id' => ...
- 简单封装DBUtils 和 pymysql 并实现简单的逆向工程生成class 类的py文件
这里使用的 Python 版本是:Python 3.6.0b2. 涉及的三方库:DBUtils.pymysql 1.ConfigurationParser 通过调用Python内置的 xml.dom. ...
- MT【196】整数个数
设函数$f(x)=x^2-2ax+15-2a$的两个零点分别为$x_1,x_2$, 且在区间$(x_1,x_2)$上恰好有两个正整数,则实数$a$的取值范围______ 提示:$1<|x_1-x ...
- MT【79】任意和存在并存
评:一般这个题目是先考虑$x$的存在性,再考虑$t$的任意性.最后按照动区间定轴类型处理,考虑区间和对称轴的相对位置.
- idea问题总结记录
1.部署tomcat后,tomcat日志报错:java.lang.ClassNotFoundException 1.1 原因: tomcat虽然部署成功,但是并没有把本项目中访问服务器所需的类库加到W ...
- 【洛谷P2114】起床困难综合征 位运算+贪心
题目大意:给定 N 个操作,每个操作为按位与.或.异或一个固定的数字,现在要求从 0 到 M 中任选一个数字,使得依次经过 N 个操作后的值最大. 题解:位运算有一个重要的性质是:位运算时,无进位产生 ...