文件的上传下载

来源:互联网 发布:知乎 不知道诊所 编辑:程序博客网 时间:2024/06/05 04:25

实现上传
在实现上传前需要导入相关的jar包
commons-beanutils-1.8.3.jar
commons-fileupload-1.2.2.jar
commons-io-1.4.jar
commons-logging-1.1.1.jar
主要分为是三个步骤:

  • 得到DiskFileItemFactory工厂类,可以添加参数,文件超过多少kb便在本地缓存例如
    DiskFileItemFactory factory = new DiskFileItemFactory(20*1024, new File(“c:/c/temp”));
  • 得到解析器ServletFileUpload对象
    在解析对象之前,设置上传的文件大小
    stu.setFileMaxSize();
  • 调用解析器方法,parseRequst(),获得FileItem集合

在保存文件的目录中,我们一般保存WEB-INF目录下,目的是不让浏览器轻易访问到。我们在得到文件名后,应该对其做两个处理,一是文件同名问题,二是截取“//”之后的内容。随后之后采用哈希打散的方式保存文件,步骤如下:
- 利用文件名转换成一个十进制的哈希值,在转换成十六进制
- 取文件根目录和十六进制的哈希值的前两个字符作为新的文件路径
- 创建目录链
- 创建文件目录并保存
注意:我们可以利用ileUploadBase.FileSizeLimitExceededException抛出异常,将文件过大的信息保存起来,并传送给客户端

import java.io.File;import java.io.IOException;import java.io.PrintWriter;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.FileUploadBase;import org.apache.commons.fileupload.FileUploadException;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;import cn.itcast.commons.CommonUtils;public class FileUploadServlet extends HttpServlet {        public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {            /*             * 避免乱码             */            request.setCharacterEncoding("utf-8");              response.setContentType("text/html;chartset=utf-8");            /*             * 上传三步骤             * 1.获取工厂DiskFileItemFactory             * 2.获取解析器 ServletFileUpload             * 3.解析request,获得fileItem对象             */            DiskFileItemFactory factory=new DiskFileItemFactory();            //DiskFileItemFactory factory = new DiskFileItemFactory(20*1024, new File("c:/f/temp"));            ServletFileUpload sfu=new ServletFileUpload(factory);            //sfu.setFileSizeMax(200*1024);//设置上传文件大小            try {                List<FileItem> list=sfu.parseRequest(request);                FileItem fi=list.get(1);                /*                 * 将上传的文件保存到web——inf目录下                 * 1、用this.getServletContenxt获得files的真实路径                 * 2。获得上传的文件名,fi.getName();                 *      处理文件名:1.对“//”进行截取                 *                  2.处理同名问题                 * 3.目录打散处理(5步奏)                 *      1.获取目录的哈希值                 *      2.将哈希值转换成十六进制                 *      3.创建文件的目录                 *      4.目录建构                 *      5.文件的写入                 */                String filepath=this.getServletContext().getRealPath("/WEB-INF/files/");//获得真实路径                String filename=fi.getName();//获得上传文件名                /*                 * 对文件名截取“//“之后的内容                 */                int index=filename.lastIndexOf("//");                if(index!=-1){                    filename=filename.substring(index+1);                }                filename=CommonUtils.uuid()+"_"+filename;//防止文件重名                /*                 * 采用哈希打散的方式                 */                int hash=filename.hashCode();                String hex=Integer.toHexString(hash);                File file=new File(filepath,hex.charAt(0)+"/"+hex.charAt(1));//生成一个完整的路径                file.mkdirs();//创建目录链                File distFile=new File(file,filename);//创建文件目录                fi.write(distFile);                try {                    fi.write(distFile);                } catch (FileUploadException e) {                    if(e instanceof FileUploadBase.FileSizeLimitExceededException){                        request.setAttribute("msg", "您要传送的文件大于20kb");                        request.getRequestDispatcher("/test.jsp").forward(request, response);                    }                }            } catch (Exception e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }}

文件的下载:
文件的下载比上传简单的多,简二言之就是两个头,一个流

  1. 获得Context-Type头
    String ContextType=this.getServletContext.getMimeName();
  2. 获得Context-Disposition头
    String ContentDisposition=”attachment;filename=”+filename
    并要设置头 request.setHeader();
    3.FileInputStream input = new FileInputStream(filename);
    最后获取一个绑定响应的流
    ServletOutputStrean output=request.getOutputStream();
    注意,为防止下载的文件乱码,
    String fileName=new String(“xxxx”.getBytes(“GBK”),”ISO-8859-1”)
    例子
import java.io.FileInputStream;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.io.IOUtils;public class DownServlst extends HttpServlet {        public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {            String filename="d:/野子.mp3";            String farmename=new String("野子.mp3".getBytes("gbk"),"iso-8859-1");//防止下载的文件乱码            /*             * 准备两个头,一个流             * 1.contentType             * 2.contentPosition             * 3.流下载文件的数据             */            String contentType=this.getServletContext().getMimeType(filename);//通过文件名获得MIME类型            String contentDisposition="attachment;filename="+farmename;            FileInputStream in=new FileInputStream(filename);//一个流            //设置头            response.setHeader("Content_type", contentType);            response.setHeader("Content-Disposition", contentDisposition);            ServletOutputStream out=response.getOutputStream();//获取了绑定响应端的流            IOUtils.copy(in, out);            in.close();        }}

“`

0 0
原创粉丝点击