关于文件上传下载详细笔记

           刚学完Web的文件上传下载功能,之前学.net的时候就接触过Web文件的上传下载功能,但无奈.net的功能封装的使用太过简单,都完全搞不懂技术要点,一个fileuploade服务端控件,什么都搞定。学java的长传下载功能听起来很简单,但练习的时候还是犯了一些低级错误。

            简单总结下文件上传/下载实现流程。

             文件上传:我们通过阿帕奇的一个开源组件对文件进行上传。即fileuplode组件。

                       1)首先需要一个表单,一个控件<input type="file">值得注意的是form后面必须有enctype="multipart/form-data"这样一段内容。

                        2)准备一个出来表单的servlet,这时候可以将apache的两个jar包导入到工程,分别是主包commons-fileupload-1.2.1.jar和支撑jar包commons-io-1.4.jar。

                        3)需要了解上传的几个核心api代码如下:

 

 //得到工厂
  FileItemFactory fif=new DiskFileItemFactory();

//通过工厂获得ServletFileUpload 实例
  ServletFileUpload file=new ServletFileUpload(fif);

//判断是否为文件提交表单
  if(ServletFileUpload.isMultipartContent(request)){
   try {

//通过ServletFileUpload 获得上传的FileItem集合,每一个上传参数对应一个FileItem
    List<FileItem> list=file.parseRequest(request);
   //遍历集合
    for(FileItem item:list){

//普通表单的处理方式,值得注意的是表单使用enctype="multipart/form-data字样后,参数不能通过request.getParameter()方式获取
     if(item.isFormField()){

      System.out.println(item.getFieldName());
      System.out.println(item.getString("utf-8"));
     }

//处理上传的文件

else{

//获得上传文件名
      String filename=item.getName();

//出来上传的文件文件名,加上系统时间前缀,避免上传文件名重复。
      filename=System.currentTimeMillis()+"^"+filename;

//将文件写入到指定 的位置。
      String path=getServletContext().getRealPath("/uplode");
      item.write(new File(path,filename));
     }
    }
   } catch (Exception e) {
    
    e.printStackTrace();
   }
   
  }

文件下载:文件下载需要注意几点。

                  1)通常使用指定的路径来获取文件夹下的所有文件的名字:

                        String path=getServletContext().getRealPath("/uplode");
                         File files=new File(path);
                         String[] names=files.list();

                   2)将文件的名字通过map集合带到jsp中展示,key为文件的全名(即上传后加上的前缀)value为文件被上传时使用的名字(即通过字符串截取去掉前缀后的名字)这样文件在jsp中列表的时候使用value,点击下载时则将key带到服务器进行处理

                    3)下载请求的处理代码如下:

 try {
   String key=request.getParameter("key");
   if(key==null||key.trim().length()<=0){
    return;
   }
   response.setHeader("content-disposition", "attachment; filename=" + key.substring(key.lastIndexOf("^")+1));
   InputStream in=getServletContext().getResourceAsStream("/uplode/"+key);
   OutputStream out = response.getOutputStream();
   byte[] b=new byte[1024];
   int len=0;

//这里容易出错,如果写成while((len=in.read())!=-1)你就悲剧了运行不会报错,但是下载的文件就会出问题,调试的时候一直以为是路径的问题,浪费了很多时间,估计很久找不到,我就犯了这样的低级错误。
   while((len=in.read(b))!=-1){
    out.write(b, 0, len);
   }
   out.close();
   in.close();
  } catch (Exception e) {
   throw new RuntimeException(e);
  }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值