from表單實現無跳轉上傳文件,接收頁面後臺數據
阿新 • • 發佈:2017-10-12
spl white lis not left alt tro pos ftp
實現無跳轉發送表單數據、文件,並能接收後臺返回的數據。
主要技術要點:
1、form表單添加target屬性,指定一個iframme的name;form表單提交後在iframe內嵌窗口接受響應,主頁面就不會再跳轉。
2、同時,我們需要接收知道後臺返回的數據以便我們的業務處理,這裏讓後臺返回一個帶有執行一個函數的script標簽。
<body>
<center>
<div>
<form id="addForm" class="form" method="post" enctype="multipart/form-data " target="xmlfile_iframe" style="padding:5% 0% 5% 12%;">
<table id="itemTable" class="form">
<tr>
<td class="formTitle" ><s:text name="cems.dataImport"></s:text><font face="宋體">*</font></td>
<td class ="formValue" ><input type="text" name="txt" readonly class="form-control"/></td>
<td><input type="button" value=‘<s:text name="cems.chooseFile"></s:text>‘ size="30" onclick="upload_xmlfile.click()" style="width: 73px;" class="btn btn-primary" />
<input type=" file" id="upload_xmlfile" onchange="txt.value=this.value" name="xmlfile" style="position:absolute;filter:alpha(opacity=0);-moz-opacity:0;opacity:0;margin-left:-286px; height: 25px;"size="30" />
</td>
</tr>
</table>
</form>
</div>
<div class="windowButtonDiv" style="padding-top:30px;">
<button class="btn btn-primary" id="submitButton"><span><i class="fa fa-check"></i></span><span><s:text name="cems.ok"></s:text></span></button>
<button class="btn btn-primary" id="closeWindow" onclick="dialogClose()"><span><i class="fa fa-close"></i></span> <span><s:text name="cems.cancel"></s:text></span></button>
</div>
<div class="alert alert-warning" style="text-align: center;margin-top:20px"><i class="fa fa-info"> 註意:請選擇XML文件</i></div>
</center>
<iframe name="xmlfile_iframe" style="display: none"></iframe>
</body>
<script type="text/javascript">
$(function(){
$("#submitButton").bind("click",function(){
if($("#addForm").Validform()){
var index = $("#upload_xmlfile").val().lastIndexOf(".")+1;
var ext = $("#upload_xmlfile").val().substr(index).toUpperCase();//獲得文件後綴名
//文件格式過濾,僅支持xml格式
if(ext==‘XML‘){
$("#addForm").attr("action","${basePath}/soft/kvsSoftAction_importDo.do");
$("#addForm").submit();
$(this).attr("disabled","disabled");
Loading(true);
}else{
dialogMsg(‘<s:text name="cems.soft.xmlfileTypeError"></s:text>‘,0);
}
}
});
});
function setMessage(data){
Loading(false);
if(data === "success"){
dialogMsg("導入成功!",1);
dialogClose();
}else{
dialogMsg("導入失敗",-1);
}
}
</script>
/**
* 數據導入
*/
public void importDo(){
log.info(" 數據導入-ST");
this.msg=RESULT_FAIL;
KvsSoft tempKvsSoft=null;
//List<String> failedFailName = new ArrayList<String>();
String subFilename = "";
try {
NormalUploadFileParser normalUploadFileParser = new NormalUploadFileParser();
List<FileInfoHolder> fileInfoHolder=normalUploadFileParser.parseRequest(getRequest());
InputStream inputStream =fileInfoHolder.get(0).getInputStream();
String nameAll = fileInfoHolder.get(0).getFileName();
subFilename = nameAll.substring(nameAll.lastIndexOf("\\")+1, nameAll.length());
KvsSoftParse kvs=new KvsSoftParse();
List<KvsSoft> list =kvs.xmlToObject(inputStream);
for (KvsSoft kvsSoft : list) {
//先從數據庫查詢,如果有則更新,沒有則插入
tempKvsSoft =kvsSoftService.queryById(kvsSoft.getId());
if(tempKvsSoft==null){
//failedFailName.add(tempKvsSoft.getName());
kvsSoftService.save(kvsSoft);
}else{
tempKvsSoft.setName(kvsSoft.getName());
tempKvsSoft.setType(kvsSoft.getType());
tempKvsSoft.setCompany(kvsSoft.getCompany());
tempKvsSoft.setFlag(kvsSoft.getFlag());
tempKvsSoft.setDesInfo(kvsSoft.getDesInfo());
tempKvsSoft.setUrl(kvsSoft.getUrl());
tempKvsSoft.setPublishTime(kvsSoft.getPublishTime());
tempKvsSoft.setVersion(kvsSoft.getVersion());
tempKvsSoft.setInstallPath(kvsSoft.getInstallPath());
tempKvsSoft.setEngineVer(kvsSoft.getEngineVer());
tempKvsSoft.setVirusBaseVer(kvsSoft.getVirusBaseVer());
tempKvsSoft.setSoftVersion(kvsSoft.getSoftVersion());
tempKvsSoft.setSoftEngineVer(kvsSoft.getSoftEngineVer());
tempKvsSoft.setSoftVirusBaseVer(kvsSoft.getSoftVirusBaseVer());
//failedFailName.add(tempKvsSoft.getName());
kvsSoftService.update(tempKvsSoft);
}
}
this.msg=RESULT_SUCCESS;
log.info(" 數據導入成功!");
inputStream.close();
} catch (Exception e) {
log.error("批量導入出錯", e);
}finally{
managerOperaterLogService.save("cems_operatekvsSoftImport" ,new String[]{subFilename} );
StringBuilder sb =new StringBuilder();
sb.append("<script type=‘text/javascript‘>");
sb.append("window.parent.setMessage(‘"+this.msg+"‘)");
sb.append("</script>");
print(sb.toString());
log.info(" 記錄操作到日誌表-END-返回數據"+sb.toString());
}
}
在提交上傳文件之前:<script type="text/javascript">window.parent.setMessage(‘success‘)</script>,是不會有的。
其中window.parent就表示隱藏的iframe的父級,在父級裏面去調用setMessage函數。當然你這個setMessage函數得在父級區域有定義,否則會報:window.parent.setMessage is not a function 的錯誤。
主要是後臺傳值得傳一個這樣的數據來:res.send(‘<script>window.parent.uploadSuccess(‘+data+‘)</script>‘);
StringBuilder sb =new StringBuilder();
sb.append("<script type=‘text/javascript‘>");
sb.append("window.parent.setMessage(‘"+this.msg+"‘)");
sb.append("</script>");
print(sb.toString());
還有一種方法:利用jquery-form的ajaxForm方法也可以獲取到後臺傳的數據。
參考之前寫的這篇博客:通過form表單上傳文件獲取後臺傳來的數據
from表單實現無跳轉上傳文件,接收頁面後臺數據