欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

文件的上传下载

程序员文章站 2022-03-04 21:02:34
...

文件上传

在表单中使用表单元素 input type=“file” ,浏览器在解析表单时,会自动生成一个输入框和一个按钮,输入框可供用户填写本地文件的文件名和路径名,按钮可以让浏览器打开一个文件选择框供用户选择文件。

当表单需要上传文件时,需指定表单 enctype 的值为 multipart/form-data。

对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,struts上传的功能就是基于这个实现的。common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。

  1. 进入这个网址 :http://commons.apache.org/proper/
  2. 选择 commons-fileupload/和commons-io
  3. 下载commons FileUpload组件以及commons io组件
  4. 将上述jar包添加到项目的WebRoott/WEB-INF/lib文件夹中。

文件上传的细节  

上述的代码虽然可以成功将文件上传到服务器上面的指定目录当中,但是文件上传功能有许多需要注意的小细节问题,以下列出的几点需要特别注意:  1、为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如放于WEB-INF目录下。  2、为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名。  3、为防止一个目录下面出现太多文件,要使用hash算法打散存储。  4、要限制上传文件的最大值。  5、要限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法。
JavaWeb的上传需要用到FileItem类, FileItem是一个接口,它的实现类是DiskFileItem。

需要注意getName():

用于获得文件上传字段中的文件名。
注意:IE或FireFox中获取的文件名是不一样的,IE中是绝对路径,FireFox中只是文件名。在IE中想要获取文件名需要进行字符串截取,代码如下:

 String fileName = item.getName();

 int index=fileName.lastIndexOf("\\");  
                if(index!=-1) {     
                 fileName=fileName.substring(index+1);  
                 }

创建jsp页面

  <form action="FileUp" method="post" enctype = "multipart/form-data">
   <input type="file" name = "fileUp" >
   <input type="submit">

文件的上传下载
FileUp.java

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            String savePath = this.getServletContext().getRealPath("/WEB-INF/upload/");
            String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp/");
            File tmpFile = new File(tempPath);
            File saveP = new File(savePath);
            if(!saveP.exists()){
                saveP.mkdirs();
            }

            if(!tmpFile.exists()){
                tmpFile.mkdirs();
            }


            String mesage = "";
                DiskFileItemFactory factory = new DiskFileItemFactory();
                factory.setSizeThreshold(1024*100);
                factory.setRepository(tmpFile);
                ServletFileUpload upload = new ServletFileUpload(factory);
                upload.setSizeMax(1024*1024*10);
                try{
                    List<FileItem> items = upload.parseRequest(request);
                    for(FileItem list:items){                   
                        String contentType = list.getContentType();
                        long sizeInBytes = list.getSize();
                        InputStream in = list.getInputStream();
                        byte[] buffer = new byte[21000];
                        int len = 0;
                         String fileName = list.getName();
                         int index=fileName.lastIndexOf("\\");  
                                        if(index!=-1) {     
                                         fileName=fileName.substring(index+1);  
                                         }
                        //.getName()注意:IE或FireFox中获取的文件名是不一样的,IE中是绝对路径,FireFox中只是文件名。在IE中想要获取文件名需要进行字符串截取,代码如下:
                        OutputStream out = new FileOutputStream(savePath+"/"+fileName);
                        while((len = in.read(buffer))!=-1){
                            out.write(buffer,0,len);
                        }
                        out.close();
                        in.close();
                    }
                } catch (FileUploadException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }



    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            doGet(request, response);

    }

查找之后打开E:\apache-tomcat-7.0.82\webapps\fileDownloadUp2_5\WEB-INF\upload可以看到上传的文件。