利用apache组件实现文件上传

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用apache组件实现文件上传相关的知识,希望对你有一定的参考价值。

实现文件上传需要引入:
  • commons-fileupload-1.3.2.jar
  • commons-io-2.5.jar
  • commons-logging-1.2.jar
 
 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <meta charset="UTF-8">
 5 <title>Insert title here</title>
 6 </head>
 7 <body> 
 8     <form action="upload" method="post" enctype= "multipart/form-data">
 9         <input type="text" name="username"/><br/>
10         <input type="password" name="passwd" ><br/>
11         <input type="file" name="file">    <br/>
12         <input type="submit">
13     </form>
14 </body>
15 </html>
  • enctype= "multipart/form-data" 是实现文件上传必不可缺少的属性,但是加了此属性之后,就不能以 request.getParameter(arg0); 来获取表单值,只能通过getFieldName()获取表单名,getString()获取表单值。
if(items.isFormField()){   
            if("des".equals(items.getFieldName())){
                        fileDesc1=new String(items.getString().getBytes("iso-8859-1"),"UTF-8");
                    
                      }

 

  • 用户上传文件之后,通过表单的action属性发送到相应的servlet进行处理,我们在得到用户提交的数据之后,把用户数据分为两种: 1.普通文本数据 2.文件 对于文件数据我们要进行特别的处理才能正常使用。
  1. 我们通过创建磁盘文件工厂的对象DiskFileItemFactory来设置文件的临界值(超过这个临界值就需要通过临时文件来作为缓冲)和临时目录以及上传文件保存目录等等。
DiskFileItemFactory diff=new DiskFileItemFactory();
  diff.setSizeThreshold(10*1024*1024);
  diff.setRepository(new File(this.getServletContext().getRealPath("tmp"))); 

  2.    然后设置文件上传对象ServletFileUpload,并把文件工厂的对象添加进来。

ServletFileUpload sfu=new ServletFileUpload(diff);

  3.    接下来我们需要对文件进行解析。fileUpload.parseRequest()用于解析文件请求,并返回一个List<FileItem>类。FileItem类用来封装单个表单字段元素的数据,一个表单元素对应一个对象(表单元素是允许用户在表单中(比如:文本域,下拉列表,单选框,复选框等等)输入信息的元素)。

List<FileItem> item=null; 
    try {            
            item=fileUpload.parseRequest(request);
                for(FileItem items:item){                
                if(items.isFormField()){  //为普通表单

                    if("des".equals(items.getFieldName())){  //表单
                        fileDesc1=new   String(items.getString().getBytes("iso-8859-1"),"UTF-8");                    
                    }                
                }else{    //为表单中的文件                
                    String uppath=this.getServletContext().getRealPath("upload");    //获得上传文件夹路径
                 FileOutputStream fos=new FileOutputStream(uppath+"/"+items.getName());    //文件输出流,流向件而不是文件夹
                
                    fileDesc=items.getName();   
                    
                    if(items.isInMemory()){     //小于10M,直接写到上传文件夹   
                        fos.write(items.get());    //往流里写内容,流入文件                    
                    }else{    //大于10M,先上传到临时文件夹tmp中           
                        IOUtils.copy(items.getInputStream(), fos);    //将输入流的内容复制到输出流,流入文件
                    }
                    fos.close();
                }                
            }
    
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

 

 

 

 

 

 

以上是关于利用apache组件实现文件上传的主要内容,如果未能解决你的问题,请参考以下文章

利用apache组件进行文件上传下载

在Servlet中利用Apache开源类库实现文件上传

大文件上传下载实现思路,分片断点续传代码实现,以及webUpload组件

利用Apache漏洞getshell(.htaccess 文件攻击上传shell)

Apache Commons FileUpload实现文件上传

文件上传漏洞成因是啥?