Apache 文件上传与文件下载案例详解

写一个Apache文件上传与文件下载的案例:以供今后学习

web.xml配置如下:

<span style="font-family:SimSun;font-size:14px;"><?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
 <display-name>FileUploadAndDownload</display-name>
 <welcome-file-list>
  <welcome-file>index.html</welcome-file>
  <welcome-file>index.htm</welcome-file>
  <welcome-file>index.jsp</welcome-file>
  <welcome-file>default.html</welcome-file>
  <welcome-file>default.htm</welcome-file>
  <welcome-file>default.jsp</welcome-file>
 </welcome-file-list>
  <!-- 上传配置 -->
  <servlet>
    <servlet-name>uploadHandleServlet</servlet-name>
    <servlet-class>com.zeng.controller.UploadHandleServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>uploadHandleServlet</servlet-name>
    <url-pattern>/upload/uploadHandleServlet</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>listFileServlet</servlet-name>
    <servlet-class>com.zeng.controller.ListFileServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>listFileServlet</servlet-name>
    <url-pattern>/listFileServlet</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>downLoadServlet</servlet-name>
    <servlet-class>com.zeng.controller.DownLoadServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>downLoadServlet</servlet-name>
    <url-pattern>/download/downLoadServlet</url-pattern>
  </servlet-mapping>
</web-app></span> 

2.upload.jsp文件

<span style="font-family:SimSun;font-size:14px;"><%@page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
 <head>
  <title>文件上传</title>
 </head> 

 <body>
 <!--
  ${pageContext.request.contextPath} : 作用是取出部署的应用程序名
  缺点:操作不便,其他工具无法正确解释${pageContext.request.contextPath}  

  如果Servlet的配置路径为 /upload/uploadHandleServlet
  action跳转路径为:    ${pageContext.request.contextPath}/upload/uploadHandleServlet 

  上传文件时,必须
  1.enctype="multipart/form-data"
  2.method=post
  -->
  <form action="${pageContext.request.contextPath}/upload/uploadHandleServlet" enctype="multipart/form-data" method="post">
    上传用户:<input type="text" name="username"><br/>
    上传文件1:<input type="file" name="file1"><br/>
    上传文件2:<input type="file" name="file2"><br/>
    <input type="submit" value="提交">
  </form>
 </body>
</html></span> 

3.message.jsp

<span style="font-family:SimSun;font-size:14px;"><%@page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
 <head>
  <title>消息提示</title>
 </head>
 <body>
    ${message}
 </body>
</html></span> 

4.UploadHandleServlet.java

<span style="font-family:SimSun;font-size:14px;">package com.zeng.controller;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* @ClassName: UploadHandleServlet
* @Description: TODO(这里用一句话描述这个类的作用)
*/
public class UploadHandleServlet extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
        //得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
        String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
        //上传时生成的临时文件保存目录
        String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
        File tmpFile = new File(tempPath);
        if (!tmpFile.exists()) {
          //创建临时目录
          tmpFile.mkdir();
        }
        //消息提示
        String message = "";
        try{
          //使用Apache文件上传组件处理文件上传步骤:
          //1、创建一个DiskFileItemFactory工厂
          DiskFileItemFactory factory = new DiskFileItemFactory();
          //设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。
          factory.setSizeThreshold(1024*100);//设置缓冲区的大小为100KB,如果不指定,那么缓冲区的大小默认是10KB
          //设置上传时生成的临时文件的保存目录
          factory.setRepository(tmpFile);
          //2、创建一个文件上传解析器
          ServletFileUpload upload = new ServletFileUpload(factory);
          //监听文件上传进度
          upload.setProgressListener(new ProgressListener(){
            public void update(long pBytesRead, long pContentLength, int arg2) {
              System.out.println("文件大小为:" + pContentLength + ",当前已处理:" + pBytesRead + ",arg2: " + arg2);
              /**
               * 文件大小为:14608,当前已处理:4096
                文件大小为:14608,当前已处理:7367
                文件大小为:14608,当前已处理:11419
                文件大小为:14608,当前已处理:14608
               */
            }
          });
           //解决上传文件名的中文乱码
          upload.setHeaderEncoding("UTF-8");
          //3、判断提交上来的数据是否是上传表单的数据
          if(!ServletFileUpload.isMultipartContent(request)){
            //按照传统方式获取数据
            return;
          }
          //设置上传单个文件的大小的最大值,目前是设置为1024*1024*20字节,也就是20MB
          upload.setFileSizeMax(1024*1024*20);
          //设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为100MB
          upload.setSizeMax(1024*1024*100);
          //4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
          List<FileItem> list = upload.parseRequest(request);
          for(FileItem item : list){
            //如果fileitem中封装的是普通输入项的数据
            if(item.isFormField()){
              String name = item.getFieldName();
              //解决普通输入项的数据的中文乱码问题
              String value = item.getString("UTF-8");
              System.out.println(name + "=" + value);
            }else{//如果fileitem中封装的是上传文件
              //得到上传的文件名称,
              String filename = item.getName();
              System.out.println(filename);
              if(filename==null || filename.trim().equals("")){
                continue;
              }
              //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
              //处理获取到的上传文件的文件名的路径部分,只保留文件名部分
              filename = filename.substring(filename.lastIndexOf("\\")+1);
              //得到上传文件的扩展名
              String fileExtName = filename.substring(filename.lastIndexOf(".")+1);
              //如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法
              System.out.println("上传的文件的扩展名是:"+fileExtName);
              //获取item中的上传文件的输入流
              InputStream in = item.getInputStream();
              //得到文件保存的名称
              String saveFilename = makeFileName(filename);
              //文件名:d507ef2e-aca9-4908-a8b9-c1d1c6a2f4d9_日语二级语法大全(推荐).doc
              //System.out.println("saveFilename: " + saveFilename);
              //得到文件的保存目录
              String realSavePath = makePath(saveFilename, savePath);
              //创建一个文件输出流
              FileOutputStream out = new FileOutputStream(realSavePath + "\\" + saveFilename);
              //创建一个缓冲区
              byte buffer[] = new byte[1024];
              //判断输入流中的数据是否已经读完的标识
              int len = 0;
              //循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
              while((len=in.read(buffer))>0){
                //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中
                out.write(buffer, 0, len);
              }
              //关闭输入流
              in.close();
              //关闭输出流
              out.close();
              //删除处理文件上传时生成的临时文件
              //item.delete();
              message = "文件上传成功!";
            }
          }
        }catch (FileUploadBase.FileSizeLimitExceededException e) {
          e.printStackTrace();
          request.setAttribute("message", "单个文件超出最大值!!!");
          request.getRequestDispatcher("../message.jsp").forward(request, response);
          return;
        }catch (FileUploadBase.SizeLimitExceededException e) {
          e.printStackTrace();
          request.setAttribute("message", "上传文件的总的大小超出限制的最大值!!!");
          request.getRequestDispatcher("../message.jsp").forward(request, response);
          return;
        }catch (Exception e) {
          message= "文件上传失败!";
          e.printStackTrace();
        }
        request.setAttribute("message",message);
        //访问路径 /FileUploadAndDownload/upload/upload.jsp
        //跳转路径 /FileUploadAndDownload/upload/listFileServlet
        //转发路径 /FileUploadAndDownload/message.jsp
        //当前路径是在/FileUploadAndDownload/upload/下,要跳到/FileUploadAndDownload/下,必须../message.jsp
        //-----如果 message.jsp是在/FileUploadAndDownload/upload/下,则直接使用message.jsp
        request.getRequestDispatcher("../message.jsp").forward(request, response);
  }
  /**
  * @Method: makeFileName
  * @Description: 生成上传文件的文件名,文件名以:uuid+"_"+文件的原始名称
  * @param filename 文件的原始名称
  * @return uuid+"_"+文件的原始名称
  */
  private String makeFileName(String filename){ //2.jpg
    //为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
    return UUID.randomUUID().toString() + "_" + filename;
  }
  /**
   * 为防止一个目录下面出现太多文件,要使用hash算法打散存储
  * @Method: makePath
  * @param filename 文件名,要根据文件名生成存储目录
  * @param savePath 文件存储路径
  * @return 新的存储目录
  */
  private String makePath(String filename,String savePath){
    //得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址
    int hashcode = filename.hashCode();
    int dir1 = hashcode&0xf; //0--15
    int dir2 = (hashcode&0xf0)>>4; //0-15
    //构造新的保存目录
    String dir = savePath + "\\" + dir1 + "\\" + dir2; //upload\2\3 upload\3\5
    //hashcode: -1390239557 dir1: 11 dir: 11 (以d507ef2e-aca9-4908-a8b9-c1d1c6a2f4d9_日语二级语法大全(推荐).doc为例子)
    System.out.println("上传前:hashcode: "+ hashcode + " dir1: " +dir1 + " dir: " + dir2);
    //File既可以代表文件也可以代表目录
    File file = new File(dir);
    //如果目录不存在
    if(!file.exists()){
      //创建目录
      file.mkdirs();
    }
    return dir;
  }
  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doGet(request, response);
  }
}
// ----------------------------------------------------------简单版本,不处理上传空间和上传的文件名
//
//import java.io.File;
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.io.InputStream;
//import java.util.List;
//import javax.servlet.ServletException;
//import javax.servlet.http.HttpServlet;
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import org.apache.commons.fileupload.FileItem;
//import org.apache.commons.fileupload.disk.DiskFileItemFactory;
//import org.apache.commons.fileupload.servlet.ServletFileUpload;
//
//public class UploadHandleServlet extends HttpServlet {
//
//  public void doGet(HttpServletRequest request, HttpServletResponse response)
//      throws ServletException, IOException {
//        //得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
//        String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
//        File file = new File(savePath);
//        //判断上传文件的保存目录是否存在
//        if (!file.exists() && !file.isDirectory()) {
//          System.out.println(savePath+"目录不存在,需要创建");
//          //创建目录
//          file.mkdir();
//        }
//        //消息提示
//        String message = "";
//        try{
//          //使用Apache文件上传组件处理文件上传步骤:
//          //1、创建一个DiskFileItemFactory工厂
//          DiskFileItemFactory factory = new DiskFileItemFactory();
//          //2、创建一个文件上传解析器
//          ServletFileUpload upload = new ServletFileUpload(factory);
//           //解决上传文件名的中文乱码
//          upload.setHeaderEncoding("UTF-8");
//          //3、判断提交上来的数据是否是上传表单的数据
//          if(!ServletFileUpload.isMultipartContent(request)){
//            //按照传统方式获取数据
//            return;
//          }
//          //4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
//          List<FileItem> list = upload.parseRequest(request);
//          for(FileItem item : list){
//            //如果fileitem中封装的是普通输入项的数据
//            if(item.isFormField()){
//              String name = item.getFieldName();
//              //解决普通输入项的数据的中文乱码问题
//              String value = item.getString("UTF-8");
//              //value = new String(value.getBytes("iso8859-1"),"UTF-8");
//              System.out.println(name + "=" + value);
//            }else{//如果fileitem中封装的是上传文件
//              //得到上传的文件名称,
//              String filename = item.getName();
//              System.out.println(filename);
//              if(filename==null || filename.trim().equals("")){
//                continue;
//              }
//              //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
//              //处理获取到的上传文件的文件名的路径部分,只保留文件名部分
//              filename = filename.substring(filename.lastIndexOf("\\")+1);
//              //获取item中的上传文件的输入流
//              InputStream in = item.getInputStream();
//              //创建一个文件输出流
//              FileOutputStream out = new FileOutputStream(savePath + "\\" + filename);
//              //创建一个缓冲区
//              byte buffer[] = new byte[1024];
//              //判断输入流中的数据是否已经读完的标识
//              int len = 0;
//              //循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
//              while((len=in.read(buffer))>0){
//                //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中
//                out.write(buffer, 0, len);
//              }
//              //关闭输入流
//              in.close();
//              //关闭输出流
//              out.close();
//              //删除处理文件上传时生成的临时文件
//              item.delete();
//              message = "文件上传成功!";
//            }
//          }
//        }catch (Exception e) {
//          message= "文件上传失败!";
//          e.printStackTrace();
//
//        }
//        request.setAttribute("message",message);
//        request.getRequestDispatcher("/message.jsp").forward(request, response);
//  }
//
//  public void doPost(HttpServletRequest request, HttpServletResponse response)
//      throws ServletException, IOException {
//
//    doGet(request, response);
//  }
//}</span>
<上传文件完毕>

1.listfile.jsp

<span style="font-family:SimSun;font-size:14px;"><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML>
<html>
<head>
  <title>下载文件显示页面</title>
  <meta charset="UTF-8">
  <style type="text/css">
    .filelistTab{
      width: 500px;
      border: 2px solid gray;
      border-collapse: collapse;
    }
    .filelistTd{
      height:25px;
      border: 1px solid gray;
    }
  </style>
</head>
<body>
 <%--
 <c:url var="path" value="download/downLoadServlet">
  <c:param name="filename" value="myOPQ"></c:param>
 </c:url>
 <a href="${path }" rel="external nofollow" rel="external nofollow" >下载文件</a>
 --%>
 <!-- 遍历Map集合 -->
 <table class="filelistTab">
 <c:forEach items="${fileNameMap }" var="fileNames">
    <tr>
      <td class="filelistTd">
        <c:url value="download/downLoadServlet" var="path">
          <c:param name="filename" value="${fileNames.key}"></c:param>
        </c:url>${fileNames.value}
      </td>
      <td class="filelistTd"><a href="${path }" rel="external nofollow" rel="external nofollow" >下载</a></td>
    </tr>
 </c:forEach>
 </table>
</body>
</html></span> 

2.ListFileServlet.java

<span style="font-family:SimSun;font-size:14px;">package com.zeng.controller;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @ClassName: ListFileServlet
* @Description: 列出Web系统中所有下载文件
*/
public class ListFileServlet extends HttpServlet {
  /*
   * ListFileServlet中listfile方法,listfile方法是用来列出目录下的所有文件的,
   * listfile方法内部用到了递归,在实际开发当中,我们肯定会在数据库创建一张表,
   * 里面会存储上传的文件名以及文件的具体存放目录,我们通过查询表就可以知道文件的具体存放目录,
   * 是不需要用到递归操作的,这个例子是因为没有使用数据库存储上传的文件名和文件的具体存放位置,
   * 而上传文件的存放位置又使用了散列算法打散存放,所以需要用到递归,在递归时,
   * 将获取到的文件名存放到从外面传递到listfile方法里面的Map集合当中,
   * 这样就可以保证所有的文件都存放在同一个Map集合当中。
   * */
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //获取上传文件的目录
    String uploadFilePath = this.getServletContext().getRealPath("/WEB-INF/upload");
    //存储要下载的文件名
    Map<String,String> fileNameMap = new HashMap<String,String>();
    //
    File file = new File(uploadFilePath);
    if(!file.exists()){
      //如果文件路径不存在,则转发
      request.setAttribute("message", "路径为空路径");
      request.getRequestDispatcher("message.jsp").forward(request, response);
    }else{
      //如果文件路径存在,则进行遍历所有文件
      //递归遍历filepath目录下的所有文件和目录,将文件的文件名存储到map集合中
      listfile(file,fileNameMap);//File既可以代表一个文件也可以代表一个目录
      //将Map集合发送到listfile.jsp页面进行显示
      request.setAttribute("fileNameMap", fileNameMap);
      request.getRequestDispatcher("listfile.jsp").forward(request, response);
    }
  }
  /**
  * @Method: listfile
  * @Description: 递归遍历指定目录下的所有文件
  * @param file 即代表一个文件,也代表一个文件目录
  * @param map 存储文件名的Map集合
  */
  public void listfile(File file,Map<String,String> map){
    //如果file代表的不是一个文件,而是一个目录
    if(!file.isFile()){
      //列出该目录下的所有文件和目录
      File files[] = file.listFiles();
      //遍历files[]数组
      for(File f : files){
        //递归
        listfile(f,map);
      }
    }else{
      /**
       * 处理文件名,上传后的文件是以uuid_文件名的形式去重新命名的,去除文件名的uuid_部分
        file.getName().indexOf("_")检索字符串中第一次出现"_"字符的位置,如果文件名类似于:9349249849-88343-8344_阿_凡_达.avi
        那么file.getName().substring(file.getName().indexOf("_")+1)处理之后就可以得到阿_凡_达.avi部分
       */
      String realName = file.getName().substring(file.getName().indexOf("_")+1);
      //file.getName()得到的是文件的原始名称,这个名称是唯一的,因此可以作为key,realName是处理过后的名称,有可能会重复
      map.put(file.getName(), realName);
    }
  }
  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doGet(request, response);
  }
}</span> 

<展示完毕>

1.DownLoadServlet.Java

<span style="font-family:SimSun;font-size:14px;">package com.zeng.controller;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownLoadServlet extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("进入");
    /*
     * fileName的格式:文件名以:uuid+"_"+文件的原始名称
     * 得到fileName:d507ef2e-aca9-4908-a8b9-c1d1c6a2f4d9_日语二级语法大全(推荐).doc
     *
     * listfile.jsp的路径传递是以 download/downLoadServlet提交
     *
     * 路径内容为:
     *   /FileUploadAndDownload/download/downLoadServlet
     *     ?filename=d507ef2e-aca9-4908-a8b9-c1d1c6a2f4d9_日语二级语法大全(推荐).doc
     * */
    String fileName = request.getParameter("filename");
    //     注意:使用了下面一句字符转码时,出错:打不到文件,
    //dir1和dir2的数字前后各不相同,导致重新创建了文件,而文件内又没有文件,故报找不到文件错误
    //fileName = new String(fileName.getBytes("iso8859-1"),"UTF-8");
    System.out.println("fileName: " + fileName);
    //上传的文件都是保存在/WEB-INF/upload目录下的子目录当中
    String fileSaveRootPath=this.getServletContext().getRealPath("/WEB-INF/upload");
    System.out.println("fileSaveRootPath: "+ fileSaveRootPath);
    //通过文件名找出文件的所在目录
    String path = findFileSavePathByFileName(fileName,fileSaveRootPath);
    System.out.println("path: "+ path);
    //服务器安装位置\wtpwebapps\FileUploadAndDownload\WEB-INF\ upload\11\11
    //得到要下载的文件,文件类型是 : uuid + "_" + 文件名
    File file = new File(path + "\\" + fileName);
    System.out.println("file: "+ file.getAbsolutePath());
    //如果文件不存在
    if(!file.exists()){
      request.setAttribute("message", "您要下载的资源已被删除!!");
      //转发到错误页面,此处要注意路径问题
      request.getRequestDispatcher("../message.jsp").forward(request, response);
      return;
    }
    //处理文件名,得到去除uuid后的文件名
    String realname = fileName.substring(fileName.indexOf("_")+1);
    System.out.println("realname: "+ realname);
    /*
     * 文件下载
     * 设置content-disposition响应头控制浏览器以下载的形式打开文件
     * 下载中文文件时,需要注意的地方就是中文文件名要使用
     * URLEncoder.encode()方法进行编码(URLEncoder.encode(fileName, "字符编码")),
     * 否则会出现文件名乱码。
     * */
    response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8"));
    //读取要下载的文件,保存到文件输入流,此处的路径还是带有uuid
    FileInputStream in = new FileInputStream(path + "\\" + fileName);
    //创建输出流
    OutputStream out = response.getOutputStream();
    //创建缓冲区
    byte buffer[] = new byte[1024];
    int len = 0;
    //循环将输入流中的内容读取到缓冲区当中
    while((len=in.read(buffer))>0){
      //输出缓冲区的内容到浏览器,实现文件下载
      out.write(buffer, 0, len);
    }
    //关闭文件输入流
    in.close();
    //关闭输出流
    out.close();
  }
  /**
  * @Method: findFileSavePathByFileName
  * @Description: 通过文件名和存储上传文件根目录找出要下载的文件的所在路径
  * @param filename 要下载的文件名
  * @param saveRootPath 上传文件保存的根目录,也就是/WEB-INF/upload目录
  * @return 要下载的文件的存储目录
  */
  public String findFileSavePathByFileName(String filename,String saveRootPath){
    int hashcode = filename.hashCode();
    int dir1 = hashcode&0xf; //0--15
    int dir2 = (hashcode&0xf0)>>4; //0-15
    String dir = saveRootPath + "\\" + dir1 + "\\" + dir2; //upload\2\3 upload\3\5
    //hashcode: -1390239557 dir1: 11 dir: 11 (以d507ef2e-aca9-4908-a8b9-c1d1c6a2f4d9_日语二级语法大全(推荐).doc为例子)
    System.out.println("hashcode: "+ hashcode + " dir1: " +dir1 + " dir: " + dir2);
    File file = new File(dir);
    if(!file.exists()){
      //创建目录
      file.mkdirs();
    }
    return dir;
  }
  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doGet(request, response);
  }
}</span> 

以上所述是小编给大家介绍的Apache 文件上传与文件下载案例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • jquery uploadify和apache Fileupload实现异步上传文件示例

    jQuery Uploadify + Apache Fileupload异步上传文件示例1.可以限制上传文件大小和类型,理论上任何类型的文件都可以上传(自己根据api配置即可):2.后台使用Apache commons-fileupload-1.3.1.jar作为上传工具包,本示例支持一次性多文件上传:3.文件上传目录可以任意指定,请在web.xml中配置:Uploadify api 详见http://www.uploadify.com/documentation/ FileUploadServ

  • Apache上传文件500错误的解决方法

    打开Apache的httpd.conf配置文件,在这个文件里增加下面的参数设置即可. 复制代码 代码如下: MaxRequestLen 10240000 我这里设置为10M,比PHP上传默认最大值8M略大即可.你可以根据自己的需要,调整这个参数的值,注意这个参数的单位是字节. 配置完成后重启Apache即可.

  • java基于Apache FTP点断续传的文件上传和下载

    基于Apache FTP实现文件上传下载工具 ,上传文件时需要考虑以下问题(实例是续传功能): (1). FTP服务器是否存在改目录,如果不存在目录则需要创建目录. (2).判断上传文件是否已经存在,如果存在是需要删除后再上传还是续传. 1.上传或下载状态的枚举类: package com.scengine.wtms.utils.ftp; public enum UploadStatus { File_Exits(0), Create_Directory_Success(1), Create_D

  • java基于Apache FTP实现文件上传、下载、修改文件名、删除

    Apache FTP 是应用比较广泛的FTP上传客户端工具,它易于操作,代码简略,结构清晰,是做FTP文件客户端管理软件的优先之选.FTP的操作包括:FTP文件上传(断点续传).FTP文件下载.FTP文件重命名.FTP文件删除,这些操作已经将FTP应用管理的方式发挥的淋漓尽致了,So 我一直都用此种方式来实现FTP文件服务器的管理工作:下附FTP工具代码. 1.FTP文件操作状态枚举类 package com.scengine.wtms.utils.ftp; public enum FTPSta

  • Apache Commons fileUpload实现文件上传之一

    废话不多说了,直奔主题了. 需要两个jar包: commons-fileupload.jar Commons IO的jar包(本文使用commons-io-2.4.jar) 利用Servlet来实现文件上传. package web.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.

  • 解决RHAS3中Apache2的PHP上传文件大小的限制

    近日将论坛从VBB2升级到VBB3,将上传附件大小设置为2M,可每次上传超过500K的附件都会出错,而之前使用VBB2时却正常. 仔细检查php.ini,其中的upload_max_filesize=8m,没有任何问题,然后将其中的: max_execution_time = 30 max_input_time = 60memory_limit = 8M 数值分别调大到120.180.32M,还是没有任何作用,令人非常头痛! 然后开始怀疑是http.conf配置文件出现的问题,但从头到尾检查了一

  • apache+php上传大文件以上传100M为例

    打开php.ini, Ctrl+F 找到下面的项并修改之.下面以上传100M为例. file_uploads = on ;是否允许通过HTTP上传文件的开关.默认为ON即是开 upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹 upload_max_filesize = 100m ;望文生意,即允许上传文件大小的最大值.默认为2M post_max_size = 100M ;指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值.

  • Apache 文件上传与文件下载案例详解

    写一个Apache文件上传与文件下载的案例:以供今后学习 web.xml配置如下: <span style="font-family:SimSun;font-size:14px;"><?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns=&

  • 网络安全漏洞渗透测试之文件上传绕过思路案例详解

    目录 引言 案例一 案例二 案例三 案例四 其它场景&总结 引言 分享一些文件上传绕过的思路,下文内容多包含实战图片,所以打码会非常严重,可多看文字表达:本文仅用于交流学习, 由于传播.利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任. 案例一 一次项目渗透时,通过往png后缀随便加个字符可知该上传点为白名单上传,正常情况下无法绕过 通过观察接口信息,发现接口名字为UploadImg,猜测该接口用于图片上传,按照开发的习惯,保不准会存在te

  • JavaWeb实现文件上传与下载实例详解

    在Web应用程序开发中,文件上传与下载功能是非常常用的功能,下面通过本文给大家介绍JavaWeb实现文件上传与下载实例详解. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,common-fileupload是依赖于c

  • SpringBoot+微信小程序实现文件上传与下载功能详解

    目录 1.文件上传 1.1 后端部分 1.2 小程序前端部分 1.3 实现效果 2.文件下载 2.1 后端部分 2.2 小程序前端部分 2.3 实现效果 1.文件上传 1.1 后端部分 1.1.1 引入Apache Commons FIleUpload组件依赖 <!--文件上传与下载相关的依赖--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fil

  • Socket+JDBC+IO实现Java文件上传下载器DEMO详解

    该demo实现的功能有: 1.用户注册: 注册时输入两次密码,若两次输入不一致,则注册失败,需要重新输入.若用户名被注册过,则提示用户重新输入用户名: 2.用户登录: 需要验证数据库中是否有对应的用户名和密码,若密码输错三次,则终止用户的登录操作: 3.文件上传: 从本地上传文件到文件数据库中 4.文件下载: 从数据库中下载文件到本地 5.文件更新: 根据id可更新数据库中的文件名 6.文件删除: 根据id删除数据库中某一个文件 7.看数据库所有文件; 8.查看文件(根据用户名); 9.查看文件

  • 基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解

    Bootstrap文件上传插件File Input是一个不错的文件上传控件,但是搜索使用到的案例不多,使用的时候,也是一步一个脚印一样摸着石头过河,这个控件在界面呈现上,叫我之前使用过的Uploadify 好看一些,功能也强大些,本文主要基于我自己的框架代码案例,介绍其中文件上传插件File Input的使用. 1.文件上传插件File Input介绍 这个插件主页地址是:http://plugins.krajee.com/file-input,可以从这里看到很多Demo的代码展示:http:/

  • 使用python flask框架开发图片上传接口的案例详解

    python版本:3.6+ 需要模块:flask,pillow 需求:开发一个支持多格式图片上传的接口,并且将图片压缩,支持在线预览图片. 目录结构: app.py编辑内容: from flask import Flask, request, Response, render_template from werkzeug.utils import secure_filename import os import uuid from PIL import Image, ExifTags app =

  • JavaScript进阶之前端文件上传和下载示例详解

    目录 文件下载 1.通过a标签点击直接下载 2.open或location.href 3.Blob和Base64 文件上传 文件上传思路 File文件 上传单个文件-客户端 上传文件-服务端 多文件上传-客户端 大文件上传-客户端 大文件上传-服务端 文件下载 1.通过a标签点击直接下载 <a href="https:xxx.xlsx" rel="external nofollow" download="test">下载文件</

  • FasfDFS整合Java实现文件上传下载功能实例详解

    在上篇文章给大家介绍了FastDFS安装和配置整合Nginx-1.13.3的方法,大家可以点击查看下. 今天使用Java代码实现文件的上传和下载.对此作者提供了Java API支持,下载fastdfs-client-java将源码添加到项目中.或者在Maven项目pom.xml文件中添加依赖 <dependency> <groupId>org.csource</groupId> <artifactId>fastdfs-client-java</arti

  • JavaWeb实现文件上传下载功能实例详解

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 文件上传概述 1.文件上传的作用 例如网络硬盘!就是用来上传下载文件的. 在智联招聘上填写一个完整的简历还需要上传照片呢. 2.文件上传对页面的要求 上传文件的要求比较多,需要记一下: 必须使用表单,而不能是超链接 表单的method必须是POST,而不能是GET 表单的enctype必须是multipart/form-data 在表单中添加file表单字段,即<input ty

随机推荐