文件下载

来源:互联网 发布:山口智子 知乎 编辑:程序博客网 时间:2024/05/17 04:58

多个文件上传

每次动态增加一个文件上传输入框,都把它和删除按纽放置在一个单独的div中,并对删除按纽的onclick事件进行响应,使之删除删除按纽所在的div

1.upload.jsp

<script type="text/javascript">

function addfile(){

var filesDiv= document.getElementById("files");

var fileInput= document.createElement("input");

fileInput.type="file";

fileInput.name="file";

 

var delButton= document.createElement("input");

delButton.type="button";

delButton.value="删除";

delButton.onclick = functiondel(){    this.parentNode.parentNode.removeChild(this.parentNode);

}

var div =document.createElement("div");

div.appendChild(fileInput);

div.appendChild(delButton);

filesDiv.appendChild(div);

}

</script>

   

    <body>

    <form action="${pageContext.request.contextPath}/servlet/UploadServlet2" method="post" enctype="multipart/form-data">

        <table>

        <tr>

        <td>用户名:</td>

        <td><input type="text" name="username"/></td>

        </tr>

        <tr>

        <td></td>

        <td><input type="button" value="添加文件 " onclick="addfile()"/></td>

        </tr>

        <tr>

        <td></td>

        <td>

           <div id="files"></div>

        </td>

        </tr>

        <tr>

        <td></td>

        <td><input type="submit" value="上传文件 "/></td>

        </tr>   

   </table>

    </form>

  </body>

2.ListFileServlet.java

public void doGet(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException{

        String filePath = this.getServletContext().getRealPath("/WEB-INF/upload");

       Map fileMap = new HashMap();

       traverse(newFile(filePath),fileMap);

      

       request.setAttribute("fileMap", fileMap);

       request.getRequestDispatcher("/listfiles.jsp").forward(request, response);

    }

    private void traverse(File file, Map fileMap) {

       if(file.isFile()){   //如file为文件,添加到fileMap中去

           String uuidName = file.getName();

           String realName =uuidName.substring(uuidName.lastIndexOf("_")+1);

           fileMap.put(uuidName, realName);

       }else{//如file为目录,则递归调用

           File[] subFiles = file.listFiles();

           for(Filef:subFiles){

              traverse(f,fileMap);

           }

       }

文件下载

3.listfiles.jsp

<c:forEach var="me"items="${filesMap}">

    <c:url var="fileAddr" value="/servlet/DownloadServlet">

        <c:param name="uuidName">${me.key }</c:param>

        <c:param name="realName">${me.value }</c:param>

    </c:url>

    文件名:${me.value }<a href="${fileAddr }">下载</a><br/>

</c:forEach>

4.DownloadServlet.java

a)        从request中取出文件名等信息,注意中文字符使用的urlencoding,需要进行手动编码转换。

b)       根据文件的uuidName计算出文件的存储路径

c)       判断目标文件是否存在

d)       设置response的header中的content-disposition值为attachment;filename=realName

e)        获取输入流,并写入输出流

public void doGet(HttpServletRequest request,HttpServletResponse response)

           throwsServletException, IOException {

       String uuidName = request.getParameter("uuidName");

       String realName = request.getParameter("realName");

      

       //因为参数是通过url传过来的,所以需要手动进行编码转换

       uuidName = newString(uuidName.getBytes("ISO8859-1"),"UTF-8");

       realName = newString(realName.getBytes("ISO8859-1"),"UTF-8");

      

       //又因为realName需要放到response的头content-disposition中去,发送到客户的资源端,

       //所以需要对它调用URLEncoder的encode方法进行url编码,才可以保证客户取到正确的征文文件名。

       realName = URLEncoder.encode(realName,"UTF-8");

      

       System.out.println("uuidName="+uuidName);

       File file = newFile(getFileAddr(uuidName));

       if(!file.exists()){

           request.setAttribute("message", "您要下载的文件不存在");

           request.getRequestDispatcher("/message.jsp").forward(request, response);

          

       }else{

           response.setHeader("content-disposition", "attachment;filename="+realName);

           FileInputStream fis = new FileInputStream(file);

           OutputStream out =response.getOutputStream();

          

           byte[] buffer= new byte[1024];

           int len=0;

           while((len=fis.read())>0){

           }

       }

    }

    private String getFileAddr(String uuidName){

       int dir1 =uuidName.hashCode() & 0xf;

       int dir2 =(uuidName.hashCode()>>4) & 0xf;

      

       String fileAddr = this.getServletContext().getRealPath("/WEB-INF/upload")+"\\"+dir1+"\\"+dir2+"\\"+uuidName;

       System.out.println("fileAddr="+fileAddr);

       return fileAddr;

    }


原创粉丝点击