批量上传文件到服务器

批量上传文件到服务器

         利用MultipartFormDataInput实现。

           简单说明:MultipartFormDataInput会读取multipart/form-data类型数据过来的head和body,且以特定符号分割里面的内容,

                   利用测试工具fiddler 测试上传接口就会发现  选择需要上传的文档时候会以一定格式分割。

            比如我们上传两个文件到服务器上

      实现代码:

          

       @POST
	@Path("/upload")
	@Consumes("multipart/form-data")
	@Produces("text/plain; charset=utf-8")
	public synchronized String manyFileUpload(MultipartFormDataInput input) throws Exception {
		 logger.info("开始上传多个文件---------");
		
                 //获取head和body所有数据,返回一个list,上传单个文件的时候 直接get0 get1即可得到文件名和上传的内容
		 logger.debug("读取文件头1:{}",input.getParts());
		// logger.debug("读取文件头2:{}",input.getFormData());
                 //获取获取head和body所有数据,返回一个map,可通过key来获取指定的head或body内容
		 logger.debug("读取文件头3:{}",input.getFormDataMap());
		 logger.debug("读取文件头4:{}",input.getPreamble());
		
		Map<String, List<InputPart>> uploadForm = input.getFormDataMap();
		List<InputPart> bodys = uploadForm.get("Filedata");//得到上传文件的内容
		List<InputPart> heads = uploadForm.get("fileName");//得到上传文件的名称,主要获取后缀
	
		//定义上传服务器的路径
		String webPath = "D:/ccc/cc/cc-ws/src/main/webapp/upload";
		
		String fileNames = null;
		
     	//获取上传文件头和内容的总数,除以2就是要生成文件的个数(因为上传文件都是文件名和文件内容成对出现,如果多个附件一个文件名,传两遍文件名,
           上传服务器的保存的时候加上年月日时分秒,分辨附件,方便对应下载)
     	for(int i=0;i<input.getParts().size()/2;i++){
     		InputPart body = bodys.get(i);
     		InputPart head = heads.get(i);
     		//读取头,获取文件名
     		InputStream is = head.getBody(InputStream.class,
					 null);
			 //读取一遍名字
			 ByteArrayOutputStream baos = new ByteArrayOutputStream();
			 int j = -1;
			 while ((j = is.read()) != -1) {
				 baos.write(j);
			 }
                         //中文名字转码,根据需要转格式,也许是utf-8
			 String fileName  = baos.toString("GBK");
			 
			 //得到上传文件保存的路径
			 String realFile = webPath + File.separator + fileName;
			 
			 //读取内容,写入文件输出
			 InputStream inputStream = body.getBody(InputStream.class,
					 null);
			 File file = new File(realFile);
			 FileUtils.copyInputStreamToFile(inputStream, file);
			 logger.info("上传保存文件成功   返回生成的文件名:	{}  , 真实路径 :	{}", fileName,
					 realFile);
			 if(fileNames == null)
				 fileNames = fileName;
			 else
				 fileNames = fileNames+"||"+fileName;
     	}
     	//根据具体需求返回结果
     	 return fileNames;
     	
	}

 
           测试代码:

              采用html测试,即上图

<html>  
  <head>  
    <base href="<%=basePath%>">  
      
    <title>My JSP 'fileupload.jsp' starting page</title>  
      
    <meta http-equiv="pragma" content="no-cache">  
    <meta http-equiv="cache-control" content="no-cache">  
    <meta http-equiv="expires" content="0">      
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
    <meta http-equiv="description" content="This is my page">  

  </head>  
    
  <body>  
     <!-- enctype 默认是 application/x-www-form-urlencoded    action  对应接口地址  input标签中的name对应文件名与内容-->  
     <form action="http://localhost:8080/cc/excel/upload" 
              enctype="multipart/form-data" method="post">  
          
       <h4>批量上传 </h4> 
                注:文件名为上传附件的名字 <br/>  
               文件名:<input type="text" name="fileName"> 附件:<input type="file"  name="Filedata"><br/>  
               文件名:<input type="text" name="fileName"> 附件:<input type="file" name="Filedata"><br/>  
              <input type="submit" value="提交"/>       
     </form>  
   
  </body>  
</html> 

 

猜你喜欢

转载自tablemiao.iteye.com/blog/2210513
今日推荐