页面使用form表单提交,后台使用springmvc接收实现文件上传功能的实现以及问题

业务需求:

需要使用excel模版(提供下载),并导入录好的excel信息,解析excel入库。

分析出的主要功能:

1.提供excel模版下载

2.上传文件

3.解析excel,并存储数据到库

代码如下:

页面:

<div class="modal fade" id="importDiv" tabindex="-1" role="dialog">
		<div class="modal-dialog" role="document">
			<div class="modal-content">
				<div class="modal-header">
					<button type="button" class="close" data-dismiss="modal"
						aria-label="Close">
						<span aria-hidden="true">×</span>
					</button>
					<h4 class="modal-title">导入索引</h4>
				</div>
				<div class="modal-body">
					<div style="width: 600px; padding: 10px; height: auto; min-height: 100px; max-height: 600px; overflow-x: hidden; overflow-y: auto;">
								
							<div class="selectArea">
								<span>类型:</span>
								 	<select id="classfication_excel" >
                                      <option value="work">著作</option>
                                      <option value="periodical">期刊论文</option>
                                      <option value="degree">学位论文</option>
                                      <option value="journal">报刊文章 </option>
                                      <option value="separateOut">析出文献 </option>
                                    </select>
							 </div>
							
							<div class="warp100">
								<div class="selectFile">
								<form method="post" enctype="multipart/form-data" id="file_form" th:action="@{/administrator/indexDataBaseManager/importData}" >
									<span>选择文件:</span>
									<input  id="excel_type" name="excel_type" type="hidden"></input>
									<input type="file" id="tempFile" name="tempFile"></input>
										
								</form>
								</div>
							</div>
					</div>
				</div>
				<div class="modal-footer">
					<button type="button" class="btn btn-primary" οnclick="downloadModel()">下载模版</button>
					<button type="button" class="btn btn-primary" οnclick="importData()">导入</button>
					<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
				</div>
			</div>
		</div>
	</div>


js代码如下:

	function downloadModel(){
					var type=$("#classfication_excel").val();
					window.location.href=getRootPath()+'/administrator/indexDataBaseManager/downloadModel?type='+type;
				}
				
				function importData(){
					var type=$("#classfication_excel").val();
					var type_name=$("#classfication_excel option:selected").text();
					var file_name=$("#tempFile").val();
					var dress=file_name.substr(file_name.length-4);
					if(file_name==""||file_name==null){
						layer.msg("请选择一个文件"); 
						return
					}
					if(dress!=".xls"){
						layer.msg("文件格式有误,请选择后缀为'.xls'的文件。"); 
						return
					}
					
					layer.confirm('类型为:'+type_name+",文件为:"+file_name+",确定导入吗?", {title:'警告',
						  btn: ['确定','取消'] //按钮
					}, function(){
						layer.msg("导入中,稍后请刷新页面查看导入结果!",{time:2000}); 
						$("#excel_type").val(type);
						setTimeout(function()
								{
							$('#file_form').submit();
								},1000);
					
					}, function(){
					}
					
					);
			
					
				}

后台springmvc代码:

	@RequestMapping(value = "/downloadModel", method = RequestMethod.GET)
	public ResponseEntity<byte[]> downloadModel(@RequestParam(value = "type")String type) throws IOException{
		
		String fileName="";
		if(type.equals("work")){
			fileName="著作.xls";
		}else if(type.equals("periodical")){
			fileName="期刊论文.xls";
		}else if(type.equals("degree")){
			fileName="学位论文.xls";
		}else if(type.equals("journal")){
			fileName="报刊文章.xls";
		}else if(type.equals("separateOut")){
			fileName="析出文献.xls";
		}
		String path=indexTemplate+fileName;
		File file =new File(path);
	       HttpHeaders headers = new HttpHeaders();
	       fileName=new String(fileName.getBytes("UTF-8"),"iso-8859-1");
	        headers.setContentDispositionFormData("attachment", fileName);   
	        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
	        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),    
	                                          headers, HttpStatus.CREATED); 
	}
	@RequestMapping(value = "/importData", method = RequestMethod.POST)
	public String importData(@RequestParam(value = "excel_type") final String excel_type, @RequestParam(value = "tempFile") final MultipartFile tempFile) {
	    
		
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				try {
			
				 Map<String, String> fieldMap = new LinkedHashMap<String, String>();
			        if(excel_type.equals("work")){
			    		fieldMap.put("责任者", "author");
			    		fieldMap.put("题名", "title");
			    		fieldMap.put("语言", "indexLang");
			    		fieldMap.put("学科", "indexTag");
			    		fieldMap.put("出版地", "city");
			    		fieldMap.put("出版单位", "press");
			    		fieldMap.put("出版时间", "pressDate");
			    		fieldMap.put("链接地址", "url");
			        }else if(excel_type.equals("periodical")){
			    		fieldMap.put("责任者", "author");
			    		fieldMap.put("题名", "title");
			    		fieldMap.put("语言", "indexLang");
			    		fieldMap.put("学科", "indexTag");
			    		fieldMap.put("出版地", "city");
			    		fieldMap.put("期刊名", "press");
			    		fieldMap.put("出版时间", "pressDate");
			    		fieldMap.put("页码", "page");
			    		fieldMap.put("链接地址", "url");
			        }else if(excel_type.equals("degree")){
			        	fieldMap.put("责任者", "author");
			    		fieldMap.put("题名", "title");
			    		fieldMap.put("论文性质", "property");
			    		fieldMap.put("语言", "indexLang");
			    		fieldMap.put("学科", "indexTag");
			    		fieldMap.put("出版地", "city");
			    		fieldMap.put("学校", "press");
			    		fieldMap.put("出版时间", "pressDate");
			    		fieldMap.put("链接地址", "url");
			        }else if(excel_type.equals("journal")){
			        	fieldMap.put("责任者", "author");
			    		fieldMap.put("题名", "title");
			    		fieldMap.put("语言", "indexLang");
			    		fieldMap.put("学科", "indexTag");
			    		fieldMap.put("出版地", "city");
			    		fieldMap.put("报纸名称", "press");
			    		fieldMap.put("出版时间", "pressDate");
			    		fieldMap.put("版次", "version");
			    		fieldMap.put("链接地址", "url");
			        }else if(excel_type.equals("separateOut")){
			        	fieldMap.put("责任者", "author");
			    		fieldMap.put("题名", "title");
			    		fieldMap.put("原著题名", "originalTitle");
			    		fieldMap.put("编者", "originalAuthor");
			    		fieldMap.put("语言", "indexLang");
			    		fieldMap.put("学科", "indexTag");
			    		fieldMap.put("出版地", "city");
			    		fieldMap.put("出版单位", "press");
			    		fieldMap.put("出版时间", "pressDate");
			    		fieldMap.put("页码", "page");
			    		fieldMap.put("链接地址", "url");
			        }
					
					List<IndexExcelDTO> list = new ArrayList<IndexExcelDTO>();
					try {
						list = ExcelUtil.excelToList_IndexInfoDTO(tempFile.getInputStream(), 0, fieldMap, null);
						System.out.println(list.size());
					} catch (ExcelException | IOException e) {
						e.printStackTrace();
					}
					List<Index> indexs=new ArrayList<Index>();
					 for(IndexExcelDTO dto:list){
						 Index index=new Index();
						 ArrayList<String> langs=new ArrayList<String>();
						 ArrayList<String> tags=new ArrayList<String>();
						 BeanUtils.copyProperties(dto, index);				 
						 langs.add(dto.getIndexLang());
						 tags.add(dto.getIndexTag());
						 index.setIndexLang(langs);
						 index.setIndexTag(tags);
						 index.setClassfication(excel_type);
						 index.setCreateDate(new Date());
						 indexs.add(index);
					 }
					List<Index> saved=(List<Index>) indexRepository.save(indexs);
					if(null!=saved && saved.size()!=0){
						log.info("导入成功,类型为{},导入个数为:{},文件名为:{}",excel_type,saved.size(),tempFile.getOriginalFilename());
					}else{
						log.info("导入失败,类型为{},文件名为:{}",excel_type,tempFile.getOriginalFilename());
					}
					
				} catch (Exception e) {
					log.error("导入出错!类型为{},文件名为:{}", e,excel_type,tempFile.getOriginalFilename());
				}
			}
		}).start();
      
	    return "redirect:/administrator/indexDataBaseManager/list";
	}
	

问题:

之前我在导入excel的springmvc的代码中 返回的是:

/administrator/indexDataBaseManager/list 

而未加上重定向的redirect 

这导致我在导完数据后,页面地址还是指向方法,我在刷新页面的时候,会有一个问题:表单重复提交。。。经过各种尝试,使用redirect 解决了这个问题。  写此文以记之。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值