传智播客Java培训---文件上传和下载

按老师的说法,以后几天的课程不用像前几天那样紧张了,可以多拿点时间消化一下前几天的学习了东西了,这几天的讲的内容太多而且大部分都很重要还不容易理解,对于一些内容到现在还是不是很明白,我想这是不是在课程安排的时候特意这么做的,在进行了几天比较难的课程后插一段比较简单的,要是真是这样的话这设计课程的人也太牛X了,今天上课主要的内容是文件的上传和下载的操作,讲完这些基本操作后老师带我们做了一个小案例,把代码综合练习了一下,要求把文件上传到服务器端,并把文件信息放入数据库,还可以在页面查看所有上传文件的信息列表,通过读取数据库信息实现下载,案例比较简单,但是最后还是出了问题,可以下载不带中文字符的资源,但是带中文字符就会出现乱码,报一个文件找不到异常,上课老师讲了两种防止文件乱码的方式:

response.setContentType("application/x-msdownload");
  response.setHeader("Content-Disposition", "attachment;filename="
    + URLEncoder.encode(filename, "UTF-8"));
 response.setHeader("Content-Disposition", "attachment;filename="
  + new String(filename.getBytes("ISO-8859-1"),"gbk"));

基于Commons-fileupload 组件的文件上传
表单中的表单元素 <input type=“file” />,会自动生成一个输入框和一个按钮,输入框可供用户填写本地文件的文件名和路径名,按钮可以让浏览器打开一个文件选择框供用户选择文件。
使用表单上传文件首先要指定表单 enctype 的值为 multipart/form-data,它指定了发向服务器的浏览器使用的编码类型,表示表单以二进制传输数据 。
导入commons-io-1.4.jar和commons-fileupload-1.2.1.jar两个jar包。
// Create a factory for disk-based file items
  FileItemFactory factory = new DiskFileItemFactory();
  // Create a new file upload handler
  ServletFileUpload upload = new ServletFileUpload(factory);
  // Parse the request
  try {
   List<FileItem> items = upload.parseRequest(request);
   Iterator<FileItem> iter = items.iterator();
   while (iter.hasNext()) {
       FileItem item = (FileItem) iter.next();
       if (item.isFormField()) {
        String name = item.getFieldName();
           String value = item.getString();   
       } else {
        String fieldName = item.getFieldName();
           String fileName = item.getName();
           String contentType = item.getContentType();
           boolean isInMemory = item.isInMemory();
           long sizeInBytes = item.getSize();
           File uploadedFile = new File("E://"+fileName+"");
           item.write(uploadedFile);
       }
   }
  } catch (FileUploadException e) {
   e.printStackTrace();
  } catch (Exception e) {
   e.printStackTrace();
  }
文件下载
 从JSP页面点击链接下载文件流程:
1 点击链接到servlet中处理,在servlet中首先要设置 2 个报头:
/*
     *设置响应报头 contentType: application/x-msdownload -->
     *告诉浏览器其所输出的内容的类型不是普通的文本文件或 HTML 文件,
     *而是一个要保存到本地的下载文件
     */
     //response.setHeader("content-type", "application/x-msdownload"); //另一种设置方法
     response.setContentType("application/x-msdownload");
     /*
      *  设置响应抱头 Content-Disposition: attachment
      *  Web 服务器希望浏览器不直接处理相应的实体内容,
      *  而是由用户选择将相应的实体内容保存到一个文件中
   *  defaultname是默认保存的文件名
      */
//response.setHeader("Content-Disposition ", " attachment; filename=defaultname "); //另一种设置方法
    response.setHeader("Content-Disposition", "attachment; filename=defaultname");
 2 读取需要下载的文件
 //获取下载文件存放目录的绝对路径
 String path = this.getServletContext().getRealPath("/download");
 //得到要下载文件的绝对路径
  String downpath = path + "//LICENSE.txt";
 //读取文件
  BufferedInputStream bfis = new BufferedInputStream(new FileInputStream(downpath));
3 将文件写入到响应输出流
 BufferedOutputStream bfos = new BufferedOutputStream(response.getOutputStream());
  byte [] b = new byte[200*1024];
  int len = 0;
  while((len=bfis.read(b))!=-1){
   bfos.write(b,0,len);
  }
 bfis.close();
  bfos.close();

 

 

我挨个试了都不好使,从网上也找了几个类似的解决方案,但是天不助我,纠结了一个多小时找不到原因,郁闷...

简单文件上传和下载的步骤和基本代码:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值