使用fileupload组件实现文件上传

   本次实例使用Servlet实现文件上传工作,具体详细步骤见一下代码:

   1.创建一个用于上传的jsp页面。核心代码如下:

      <body>
    <h1>文件上传</h1>
    <h3>${msg}</h3>
      <form action="<c:url value='/UploadServlet'/>" method="post" enctype="multipart/form-data">
          用户名:<input type="text" name="username"/><br>
照&nbsp;&nbsp;&nbsp;&nbsp;片:<input type="file" name="picture"/><br>
          <input type="submit" value="上传"/>
      </form>
  </body>

记住别忘了导入jstl核心标签库<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


2.新建一个Servlet,在其post方法里面完成文件上传,并实现自动查找哪一个才是文本域,自动在用户电脑里建立文件夹用来存放临时文件,自动实现建立分级目录,防止重名文件被覆盖等问题。

   public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        
        /*
         * 上传3步
         * 1.得到工厂
         */
        //基于磁盘文件项目创建一个工厂对象(并设置内存中允许存储的字节数和临时文件存储的位置)
        //先往用户的磁盘里新建这样一个目录,不存在就创建它。用来为后面放临时文件做准备
        File temp=new File("F:/f/temp");//(每接收10KB就往临时文件放入10KB)
        temp.mkdirs();//创建文件夹目录
        DiskFileItemFactory factory=new DiskFileItemFactory(20*1024,new File("F:/f/temp"));
        //解析器(创建一个新的文件上传对象)
        ServletFileUpload upload=new ServletFileUpload(factory);

//先前为实现受限上传文件尺寸,这里设置不受限,故将以下两行代码注释掉了
        //sfu.setFileSizeMax(100*1024);//限制单个文件大小为100K
       // sfu.setSizeMax(1024*1024);//限制整个表单大小为1M
        //解析,得到List
        try {
//应用该方法获取全部的表单项,通过文件上传对象的parseRequest()方法,并保存表单项到list中
//upload的parseRequest方法会返回一系列的FileItem实例,格式为(name=?,StoreLocation=?,size=?bytes,isFormField=true/false)以他们传输的顺序排序。
List<FileItem> list=upload.parseRequest(request);
System.out.println(list);
//list集合元素的下标是从0开始的,每一个元素对应一个文本域,正好上传文件的文本域在第2个,固采用get(1)得到它。
//FileItem是接口,此句为FileItem类型的接口 fi指向FileItem类型的实例
//循环判断哪个文本域才是上传文件的那个(此方法移植性好)
Iterator iter=list.iterator();
String filename="";
FileItem fi=list.get(0);//初始化
while(iter.hasNext()){//找到哪个是文本域。适用一般情况
fi=(FileItem) iter.next();
if(!fi.isFormField()){//判断如果是文件域
filename=fi.getName();//获取上传的文件名
}
}
//FileItem fi=list.get(1);

/*
* 1.得到文件保存的路径
*/
String root=this.getServletContext().getRealPath("/WEB-INF/files");//得到根路径
/*
 * 2.生成两级目录
 *   1).得到文件名称
 *   2).得到hashcode
 *   3).转发成16进制
 *   4).获取前两个字符来生成目录
 */
//String filename=fi.getName();
/*
 * 处理文件名的绝对路径问题
 */
int index=filename.lastIndexOf("\\");
if(index!=-1){
//以下是将filename从首字母到index+1之间的字符全部去掉,只保留index+1位开始到最后字母之间的字符串
filename=filename.substring(index+1);
}
/*
 * 给文件名称添加uuid前缀,处理文件同名问题
 */
String savename=UUID.randomUUID().toString().replace("-", "")+"_"+filename;
/*
 * 1.得到hashcode
 */
int hcode=filename.hashCode();
//System.out.println(hcode);
String hex=Integer.toHexString(hcode);//转换成16进制
// System.out.println(hex);
/*
 * 2.获取hex的前两个字母,与root连接在一起,生成一个完整的路径
 */
File dirFile=new File(root,hex.charAt(0)+"/"+hex.charAt(1));
/*
 * 3.创建目录链(根据dirFile文件指向的位置创建目录而不是文件,目录的形式为root/hex.charAr(0)/hex.charAt(1))
 */
dirFile.mkdirs();//即创建一个两级目录的文件夹
/*
 * 4.创建目标文件
 */
File destFile=new File(dirFile,savename);
/*
 * 5.保存
 */
fi.write(destFile);

} catch (FileUploadException e) {
// TODO Auto-generated catch block

//当上传文件要求尺寸受限时才使用,本次实例以下代码不起作用
if(e instanceof FileUploadBase.FileSizeLimitExceededException){
request.setAttribute("mag","您上传的文件超出了100KB!");
request.getRequestDispatcher("/form3.jsp").forward(request, response);
}
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值