前言
在一个表单中上传5张图片分别隶属于5类别,在Strust2表单中赋予file控件的name属性一样,实现多张图片与该图片隶属的类别信息进行提交,后台获取上传文件的数组信息,然后将图片和类别信息进行保存,完成图片上传的功能。
正文
前台页面
前台代码
</pre><pre name="code" class="html"><s:form id="fileForm" name="fileForm" enctype="multipart/form-data" method="post" > <table class="table table-bordered table-striped" style="border: #cdcdcd 1px solid; text-align: center;" align="center"> <tr> <td> <font color="red">*</font>一类: <div> <input id="materialTypeName" name="materialTypeName1" type="radio" value="企业法人营业执照" checked/> 企业法人营业执照 <input id="materialTypeName" name="materialTypeName1" type="radio" value="事业单位法人证书" /> 事业单位法人证书 <input id="materialTypeName" name="materialTypeName1" type="radio" value="民办非企业单位登记证书" /> 民办非企业单位登记证书 <br /> <br /> <input id="materialTypeName" name="materialTypeName1" type="radio" value="社会团体法人登记证书" /> 社会团体法人登记证书 <input id="materialTypeName" name="materialTypeName1" type="radio" value="个人工商户营业执照" /> 个人工商户营业执照<input id="materialTypeName" name="materialTypeName1" type="radio" value="其它" /> 其它 <label class="control-label"></label> <div align="right"> <s:file id="file1" label="File(1)" name="uploads" /> </div> </div> <input id="materialType1" name="materialType1" type="hidden" value="" /> </td> </tr> <tr> <td> <div align=left> <font color="red">*</font>二类: <label style="font-size: 12px;"> 中华人民共和国组织机构代码 </label> <div align="right"> <s:file id="file2" label="File(2)" name="uploads" /> </div> </div> <input id="materialType2" name="materialType1" type="hidden" value="" /> <input id="materialTypeName2" name="materialTypeName1" type="hidden" value="" /> </td> </tr> <tr> <td> <div align=left> <font color="red">*</font>三类: <label style="font-size: 12px;"> 法定代表人身份证 </label> <div align="right"> <s:file id="file3" label="File(3)" name="uploads" /> </div> </div> <input id="materialType3" name="materialType1" type="hidden" value="" /> <input id="materialTypeName3" name="materialTypeName1" type="hidden" value="" /> </td> </tr> <tr> <td> <div align=left> 四类: <label style="font-size: 12px;"> 劳务派遣经验许可证 </label> <div align="right"> <s:file id="file4" label="File(4)" name="uploads" /> </div> </div> <input id="materialType4" name="materialType1" type="hidden" value="" /> <input id="materialTypeName4" name="materialTypeName1" type="hidden" /> </td> </tr> <tr> <td> <div align=left> 五类: <label style="font-size: 12px;"> 其它 </label> <div align="right"> <s:file id="file5" label="File(5)" name="uploads" /> </div> </div> <input id="materialType5" name="materialType1" type="hidden" value="" /> <input id="materialTypeName5" name="materialTypeName1" type="hidden" /> </td> </tr> <tr> <td> <div align="center"> <input id="picButton" type="button" value="提交申请" onclick="validate()" class="btn btn-primary"></input> </div> </td> </tr> </table> </s:form>
前端的核心代码是下面的这个file标签数组,name属性一样,这样就可以将图片批量提交到action,action类中接收图片数组。
<s:fileid="file1" label="File(1)" name="uploads" />
<s:fileid="file2" label="File(2)" name="uploads" />
<s:fileid="file3"label="File(3)"name="uploads" />
<s:fileid="file4"label="File(4)"name="uploads" />
<s:fileid="file5"label="File(5)"name="uploads" />
Js代码
在js中我们对上传图片的格式进行了验证,同时得到每张图片所属类别的信息,然后将图片和类别信息进行Form表单提交
//验证图片格式 function validateFileFormat(){ //获取欲上传的文件路径 var filepath1 = document.getElementById('file1').value; var d1=/\.[^\.]+$/.exec(filepath1); var filepath2 = document.getElementById('file2').value; var d2=/\.[^\.]+$/.exec(filepath2); var filepath3 = document.getElementById('file3').value; var d3=/\.[^\.]+$/.exec(filepath3); var filepath4 = document.getElementById('file4').value; var d4=/\.[^\.]+$/.exec(filepath4); var filepath5 = document.getElementById('file5').value; var d5=/\.[^\.]+$/.exec(filepath5); //为了避免转义反斜杠出问题,这里将对其进行转换 var tp =".jpg,.image,.gif,.jpeg,.png,.bmp,.JPG,.GIF,.BMP,.IMAGE,.JPEG,.PNG"; //返回符合条件的后缀名在字符串中的位置 var rs1=tp.indexOf(d1); var rs2=tp.indexOf(d2); var rs3=tp.indexOf(d3); var rs4=tp.indexOf(d4); var rs5=tp.indexOf(d5); //如果返回的结果大于或等于0,说明包含允许上传的文件类型 if(rs1>=0){ if(rs2>=0){ if(rs3>=0){ if(filepath4==""){ if(filepath5==""){ return true; }else{ if(rs5>=0){ return true; }else{ alert("您选择五类型的扫描件不是有效的图片格式!"); return false; } } }else{ if(rs4>=0){ if(filepath5==""){ return true; }else{ if(rs5>=0){ return true; }else{ alert("您选择五类型的扫描件不是有效的图片格式!"); return false; } } }else{ alert("您选择四类型的扫描件不是有效的图片格式!"); return false; } } }else{ alert("您选择三类型的扫描件不是有效的图片格式!"); return false; } }else{ alert("您选择二类型的扫描件不是有效的图片格式!"); return false; } }else{ alert("您选择一类型的扫描件不是有效的图片格式!"); return false; } } //上传文件验证 function fileValidate(){ var fileName1=document.getElementById('file1').value; var fileName2=document.getElementById('file2').value; var fileName3=document.getElementById('file3').value; var fileName4=document.getElementById('file4').value; var fileName5=document.getElementById('file5').value; if(!fileName1) { alert("请选择上传文件:一类"); return false; }else{ document.getElementById('materialType1').value="1"; } if(!fileName2) { alert("请选择上传文件:二类"); return false; }else{ document.getElementById('materialType2').value="2"; document.getElementById('materialTypeName2').value="中华人民共和国组织机构代码"; } if(!fileName3) { alert("请选择上传文件:三类"); return false; }else{ document.getElementById('materialType3').value="3"; document.getElementById('materialTypeName3').value="法定代表人身份证"; } if(fileName4) { document.getElementById('materialType4').value="4"; document.getElementById('materialTypeName4').value="劳务派遣经验许可证"; //alert(document.getElementById('materialTypeName4').value) } if(fileName5) { document.getElementById('materialType5').value="5"; document.getElementById('materialTypeName5').value="其它"; //alert(document.getElementById('materialTypeName5').value) } return true; } //上传图片 function validate(){ //验证图片格式是否正确 var flag=validateFileFormat(); if(flag==true){ //alert("图片格式是正确,结果是:"+flag); //图片上传的参数准备 var flagss=fileValidate(); if(flagss==true){ //alert("图片上传最后的验证,结果是:"+flagss); //alert("文件要上传了"); //文件表单提交 document.fileForm.action="companyMaterial_add.action"; document.fileForm.submit(); } } }
action中的方法
在action类中,我们利用get和set方法将文件上传的属性注入到此action类中,包括uploads、uploadsContentType、uploadsFileName,要注意的是uploads是前台标签的的name,一定要保持一致。得到上传的文件的信息后,我们将文件上传的服务器指定的文件夹下,然后将文件的信息保存到数据库中。
package cn.bjjczb.jyzgcx.view.action; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import org.apache.commons.io.FileUtils; import org.apache.struts2.ServletActionContext; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import com.opensymphony.xwork2.ActionContext; import cn.bjjczb.jyzgcx.base.BaseAction; import cn.bjjczb.jyzgcx.domain.CompanyInfo; import cn.bjjczb.jyzgcx.domain.CompanyMaterial; import cn.bjjczb.jyzgcx.domain.DictionaryTitle; import cn.bjjczb.jyzgcx.domain.ReplyResult; @Controller @Scope("prototype") public class CompanyMaterialAction extends BaseAction<CompanyMaterial> { private List<File> uploads; // 上传多个文件的集合文本 private List<String> uploadsContentType; // /多个上传文件的类型集合 private List<String> uploadsFileName; // 多个上传文件的文件名集合 private List<String> materialTypeName1; private List<String> materialType1; /** 添加*/ public String add() throws Exception { //从session中得到上传材料的用户的信息 CompanyInfo returncompanyInfo = this.getCompanyInfo(); String comId=returncompanyInfo.getOrganizationCode(); String socId=returncompanyInfo.getSocialNumber(); CompanyInfo companyInfo=new CompanyInfo(); //得到第一类型的材料类别和名称 List<String> materialTypeList=this.getMaterialType1(); List<String> materialTypeNameList=this.getMaterialTypeName1(); //打印前台表单提交过来的文件数组的属性 System.out.println(uploadsFileName); System.out.println(materialTypeList); System.out.println(materialTypeNameList); // 把上传的文件放到指定的路径下 String path = ServletActionContext.getServletContext().getRealPath("/uploadImages"); // 写到指定的路径中 File file = new File(path); // 如果指定的路径没有就创建 if (!file.exists()) { file.mkdirs(); } // 把得到的文件的集合通过循环的方式读取并放在指定的路径下 System.out.println(uploads.size()); for (int i = 0; i < uploads.size(); i++) { try { Date date=new Date(); //list集合通过get(i)的方式来获取索引 System.out.println(uploadsFileName.get(i)); SimpleDateFormat stingDateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); String wordfileadd = stingDateFormat.format(date)+socId+uploadsFileName.get(i); FileUtils.copyFile(uploads.get(i), new File(file, wordfileadd)); } catch (IOException e) { e.printStackTrace(); } } //保存材料到数据库 String fileFolder = "\\"+"jyzgcx"+"\\"+"uploadImages"+"\\"; int n=uploadsFileName.size(); //调用方法保存材料到数据库 this.DoSaveAll(companyInfo, materialTypeList, materialTypeNameList, uploadsFileName, fileFolder, n); System.out.println("~~~~~~~~~~~~~~上传成功!"); return "repeatLogin"; } //保存图片到数据库 public void DoSaveAll(CompanyInfo companyInfo,List<String> materialTypeList,List<String> materialTypeNameList,List<String> uploadsFileName,String fileFolder,int s){ Date date=new Date(); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String createTime = formatter.format(date); CompanyMaterial companyMaterial = null; CompanyInfo returncompanyInfo = this.getCompanyInfo(); String comId=returncompanyInfo.getOrganizationCode(); String socId=returncompanyInfo.getSocialNumber(); SimpleDateFormat stingDateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); String wordfileadd = stingDateFormat.format(date)+socId; for (int i = 0; i < s; i++) { companyMaterial=new CompanyMaterial(); companyMaterial.setCompanyInfo(companyInfo); companyMaterial.setState("1"); companyMaterial.setCreateDate(createTime); companyMaterial.setMaterialType(materialTypeList.get(i)); companyMaterial.setMaterialTypeName(materialTypeNameList.get(i)); companyMaterial.setFileName(wordfileadd+uploadsFileName.get(i)); companyMaterial.setFileUrl(fileFolder+wordfileadd+uploadsFileName.get(i)); companyMaterialService.save(companyMaterial); } } public List<String> getMaterialTypeName1() { return materialTypeName1; } public void setMaterialTypeName1(List<String> materialTypeName1) { this.materialTypeName1 = materialTypeName1; } public List<String> getMaterialType1() { return materialType1; } public void setMaterialType1(List<String> materialType1) { this.materialType1 = materialType1; } public List<File> getUploads() { return uploads; } public void setUploads(List<File> uploads) { this.uploads = uploads; } public List<String> getUploadsContentType() { return uploadsContentType; } public void setUploadsContentType(List<String> uploadsContentType) { this.uploadsContentType = uploadsContentType; } public List<String> getUploadsFileName() { return uploadsFileName; } public void setUploadsFileName(List<String> uploadsFileName) { this.uploadsFileName = uploadsFileName; } }
小结
我们在Strust2的表单中赋予file控件的name属性一样,实现多张图片进行提交,后台获取file数组,完成图片上传的功能。由此拓展出来,只要前台控件的name属性一样,我们就可以在后台获取前台的name属性一样的控件数组的值,知道这一点用起来确实会方便很多。