java代码实现文件的上传,下载,删除

java io流文件操作是很基础的东西,最近正好写了一整套功能,上传,在页面显示文件名、路径、上层目录,并提供下载,删除功能,需求挺简单,代码也不复杂,在这里提供一下,也算作个笔记。

1.文件上传

前端代码:无非就是一个表单提交,写了个动态添加file标签的方法,每个file标签后面对应着下拉框,供选择路径使用,即一个文件对应一个路径。注:如果要上传多个文件,而且路径唯一,那么不需像下面这样一个file标签对应一个文件,而是可以在file标签中加个multipart属性,这样file标签里就可以选择多个文件了。

<form name="xx" action="<%=appRoots%>/require/saveFile.do" method="post" enctype="multipart/form-data" id="formId" class="pageForm required-validate" onsubmit="return iframeCallback(this, dialogAjaxDone1);">
  <table id="tb" class="searchContent e-w100" style="border-collapse:separate; border-spacing:0px 13px;">
    <tr>
      <td>
        File:
      </td>
      <td>
        <input type="file" name="photo">
        <span>子文件夹:</span><!-- <input type="text" name="subFolder"/> -->
        <select name="subFolder">
        <option value="">请选择</option>
        <option value="接口文档">接口文档</option>
        <option value="上线脚本">上线脚本</option>
        </select>
        <input type="text" name="roleIds" value="${reqId }" readonly="readonly"/>
        <button onclick="_del(this);">删除</button>
        </td>
    </tr>
  </table>
  <br/><!-- onclick="_submit();" --> 
  <a  height="650" width="850" class="button mr5" onclick="_submit();">
			<span>上传</span>
  </a>
  <a  height="650" width="850" class="button mr5" onclick="_add();" >
			<span>增加</span>
  </a>
  </form>  
  
  <script type="text/javascript">  
function _add(){
    var tb = document.getElementById("tb");
    //写入一行
    var tr = tb.insertRow();
    //写入列
    var td = tr.insertCell();
     //写入数据
    td.innerHTML="File:";
    //再声明一个新的td
    var td2 = tr.insertCell();
    //写入一个input
    td2.innerHTML='<input type="file" name="photo"/><span>子文件夹:</span> <select name="subFolder"><option value="">请选择</option><option value="接口文档">接口文档</option><option value="上线脚本">上线脚本</option></select><input type="text" name="roleIds" value="${reqId }" readonly="readonly"/><button onclick="_del(this);">删除</button>';
  }
  function _del(btn){
    var tr = btn.parentNode.parentNode;
    //alert(tr.tagName);
    //获取tr在table中的下标
    var index = tr.rowIndex;
    //删除
    var tb = document.getElementById("tb");
    tb.deleteRow(index);
  }
  function _submit(){
    //遍历所的有文件
    var files = document.getElementsByName("photo");
    if(files.length==0){
      alert("没有可以上传的文件");
      return false;
    }
    for(var i=0;i<files.length;i++){
      if(files[i].value==""){
        alert("第"+(i+1)+"个文件不能为空");
        return false;
      }
    }
   $("#formId").submit();
  }
 </script> 

后台代码

上传的后台代码很简单,就是接收file数组,循环写入的方法,需要注意的是,文件操作需要加注解,有些在xml配置里,有些写在java类配置里,这里就不多阐述了。

//@RequestParam   MultipartFile对象需要用这个注解
 @RequestMapping("/saveFile")
	@ResponseBody
	public AjaxResult saveFile(ModelAndView mav,@RequestParam MultipartFile []  photo,@Param("reqId") String reqId,@Param("roleIds") String[] roleIds,@Param("subFolder") String [] subFolder) throws IllegalStateException, IOException{
		boolean result=true;
		//服务器路径
		StringBuffer sb = new StringBuffer();
		sb.append(System.getProperty("user.dir")).append("/").append("productTool/").append("File/").append(reqId);
		AjaxResult ar=new AjaxResult();
		try {
			if(photo!=null&&photo.length>0){ 
			    //循环获取file数组中得文件 
			    for(int i = 0;i<photo.length;i++){ 
			      MultipartFile file = photo[i]; 
			      //文件名全称
			      String fullName=file.getOriginalFilename();
			      //文件名前缀
			      String fileName=fullName.substring(0, fullName.indexOf("."));
			      //文件名后缀/文件类型
			      String fileType=fullName.substring(fullName.indexOf(".")+1, fullName.length());
				  StringBuffer ss = new StringBuffer();
			      if(subFolder!=null&&subFolder.length>0){
			    	  ss.append(roleIds[i]+"/"+subFolder[i]);
			      }else {
			    	  ss.append(roleIds[i]);
			      }
			    //创建文件夹
			    getFolder(ss);		
			    file.transferTo(new File(ss.toString()+"/"+fullName));
			    } 
			  }
			 if(result){
					ar= new AjaxResult("200", "上传附件成功");
					ar.setCallbackType("closeCurrent");
					JSONObject json=new JSONObject();
					json.put("reqId", reqId);
					ar.setForwardUrl("/require/QueryGeReqMain.do?json="+json.toString());
		}
		} catch (Exception e) 
		{
		result=false;		
		ar=new AjaxResult("300", "上传附件失败");
		}
		return ar;
}
	
	//创建多层文件夹
	public static void getFolder(StringBuffer sb)
	{
		String[] dstfolders= sb.toString().split("/");
	    String[] paths=new String[dstfolders.length];
	    for(int i=0;i<dstfolders.length;i++){
  		String previous="";
  	    if(i!=0){
  	    	 previous=paths[i-1];
  	    	 paths[i]=previous+"/"+dstfolders[i];
  	    }else{
  	    	 paths[i]=dstfolders[i];
  	    }
		}
		for(int i=0;i<paths.length;i++){
		File folder =new File(paths[i]);  
  	if (!folder.exists()  && !folder .isDirectory()){ 
  	    folder.mkdir();    
  	}
		}
	}

2.文件下载

前端代码:

在转发到这个页面之前,已经通过方法将目标目录下所有文件,包括子文件夹里的文件查了出来,显示在页面上,每个文件后面配一个下载按钮。

<div style=" overflow:scroll; width:100%; height:100%;">
 <form name="xx" action="<%=appRoots%>/require/ddFile.do" method="post"  id="formId" class="pageForm required-validate" onsubmit="return iframeCallback(this, dialogAjaxDone1);">
		<p>
			<label >需求编号:</label> 
				<input type="text"   readonly="readonly" value="${reqId}" class="e-w212" />
		</p>
		<p>
			<label >需求名称:</label> 
				<input type="text"   readonly="readonly" value="${reqName}" class="e-w212" />
		</p>
		<table class="e-w100 table" id="tbs">
		<thead>
		<tr>
						<td style="width: 40%">
					    <div class="gridCol tl" title="文件名称">文件名称</div>						
						</td>
						<td style="width: 30%">
						<div class="gridCol tl" title="子文件夹">子文件夹</div>
						</td>
						<td style="width: 30%">
							<div class="gridCol tl" title="操作">操作</div>
						</td>
		</tr>
			</thead>	
				<tbody>					
					  <c:forEach  var="list" items="${geReqFileDtoList}" varStatus="status">
						<tr>
							<td style="width: 40%">${list.fileName}
							</td>
							<td style="width: 30%">
							<c:if test="${list.fileFolderName!=reqId and list.fileFolderName!='请选择'}">${list.fileFolderName}</c:if>
							</td>
							<td style="width: 30%">
								<a  height="650" width="850"  class="button mr5" href="<%=appRoots%>/require/getFilePath.do?filePath=${list.filePath}"   [minable=true,maxable=true] rel="downLoadFile"  title="下载"   >
									<span>下载</span>
								</a> 
							<a class="button mr5" href ="<%=appRoots%>/require/deleteFile.do?filePath=${list.filePath}&reqId=${reqId}&reqName=${reqName}" target="ajaxTodo" rel="delete" title="确认要删除吗">
							<span>删除</span>
							</a>
							</td>
						</tr>
						</c:forEach>
				</tbody>
			</table>
	</form>
	</div>	

后台代码:

@RequestMapping("/downLoadFile") 
    public void downLoadFile(HttpServletRequest request,HttpServletResponse response,@Param("FileName") String FileName,@Param("reqId") String reqId) throws  Exception {
    		//获取服务器项目路径
    		String oraclePath =System.getProperty("user.dir");	
    		String path = oraclePath+"/productTool/File/"+reqId; // 路径
    		File f = new File(path);
    		File fa[] = f.listFiles();
    		for (int i = 0; i < fa.length; i++) {
                  File fs = fa[i];
                  if(fs.getName().contains(FileName)){
                      dFile(fs,request,response);
                  }
             }
    }
	
public static void dFile(File file,HttpServletRequest request,HttpServletResponse response) throws Exception{
		InputStream ins = new FileInputStream(file);
        /* 设置文件ContentType类型,这样设置,会自动判断下载文件类型 */
        response.setContentType("multipart/form-data");
        /* 设置文件头:最后一个参数是设置下载文件名 */
        String formFileName = new String(file.getName().getBytes("UTF-8"), "ISO-8859-1");
        response.setHeader("Content-Disposition", "attachment;filename="+formFileName);
        try{
            OutputStream os = response.getOutputStream();
            byte[] b = new byte[1024];
            int len;
            while((len = ins.read(b)) > 0){
                os.write(b,0,len);
            }
            os.flush();
            os.close();
            ins.close();
        }catch (Exception e){
           e.printStackTrace();
}
    }	

3.文件删除

文件删除就很简单了,这里用了FileUtils工具类,这个类里有很多方法,比起传统的字符流,字节流,要来的方便的多,绝大部分时候都可以替代,不过有一个功能我没有用这个工具类实现成功,就是向同一文件里循环写入数据而不覆盖,我至今还是用FileWriter的newLine()方法实现的。

@RequestMapping("/deleteFile")
	@ResponseBody
	public AjaxResult deleteFile(ModelAndView mav,@Param("filePath")String filePath,@Param("reqId")String reqId,@Param("reqName")String reqName){
		boolean result=true;
		AjaxResult ar=new AjaxResult();
		FileUtils.deleteFile(new File(filePath));
		try {
			if(result){
				ar= new AjaxResult("200", "文件删除成功");
				ar.setCallbackType("forward");
				JSONObject json=new JSONObject();
				json.put("reqId", reqId);
				json.put("reqName", reqName);
//				ar.setForwardUrl("/require/GeReqMainQuery.do?json="+json.toString());
	}
		} catch (Exception e) {
			result=false;		
			ar=new AjaxResult("300", "文件删除失败");
		}
		return ar;
	}

最后这里提供一个查出路径下所有文件的方法。

这个方法可以遍历当前目录下所有文件及其文件夹的名称和绝对路径,有几个涉及到根据文件路径取某些特定值的方法:这里的file即下面循环中的file2,文件数组中的某一个文件对象
				  //文件名全称
				  String fullName=file.getOriginalFilename();
			      //文件名前缀
			      String fileName=fullName.substring(0, fullName.indexOf("."));
			      //文件名后缀/文件类型
			      String fileType=fullName.substring(fullName.indexOf(".")+1, fullName.length());
				  //文件名:file2.getName()
				  //文件的绝对路径:file2.getAbsolutePath()
				  //file2.getParent() 指定路径的上一层路径,例如E:/zzz.txt,这个方法取到的值就是E盘目录下
public void traverseFolder1(String path) {
        int fileNum = 0, folderNum = 0;
        File file = new File(path);
        if (file.exists()) {
            LinkedList<File> list = new LinkedList<File>();
            File[] files = file.listFiles();
            for (File file2 : files) {
                if (file2.isDirectory()) {
                    System.out.println("文件夹:" + file2.getAbsolutePath());
                    list.add(file2);
                    foldeNum++;
                } else {
                    System.out.println("文件:" + file2.getAbsolutePath());
                    fileNum++;
                }
            }
            File temp_file;
            while (!list.isEmpty()) {
                temp_file = list.removeFirst();
                files = temp_file.listFiles();
                for (File file2 : files) {
                    if (file2.isDirectory()) {
                        System.out.println("文件夹:" + file2.getAbsolutePath());
                        list.add(file2);
                        folderNum++;
                    } else {
                        System.out.println("文件:" + file2.getAbsolutePath());
                        fileNum++;
                    }
                }
            }
        } else {
            System.out.println("文件不存在!");
        }
        System.out.println("文件夹共有:" + folderNum + ",文件共有:" + fileNum);

    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章