Struts2学习笔记14:Struts2的文件上传和下载【续】

本文介绍了一个非基于Struts2的文件上传实例,详细讲解了如何利用commons-fileupload和commons-io库实现文件上传的功能,并展示了具体的实现步骤及代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

Struts2学习笔记14:Struts2的文件上传和下载【续】

第十二讲

学习内容:

通过实例,实现非基于struts2的文件上传

使用文件

下载地址:

http://apache.mirror.phpchina.com/commons/io/binaries/commons-io-1.4-bin.zip

commons-io-1.4.jar

下载地址:

http://apache.freelamp.com/commons/fileupload/binaries/commons-fileupload-1.2.1-bin.zip

commons-fileupload-1.2.1.jar

将上面的两个jar包导入到项目中——WebRoot/WEB-INF/lib目录中

步骤:

1)在src目录中新建包"upload",在包中新建Servlet文件,名为

UploadServlet.java,URL设置为"/uploadservlet"

2)在WebRoot中新建文件夹"upload",在该文件中建立两个JSP文件,分别名为:upload.jsp和result.jsp

upload.jsp    显示上传文件页面

result.jsp    返回显示信息

3)在upload.jsp文件中添加表单

<form action="/struts14/uploadservlet" method="post"

             enctype="multipart/form-data">

     username:<input type="text" name="username" />

<br/>

     password:<input type="password" name="password"/>

<br/>

     file1:<input type="file" name="file1"/><br/>

     file2:<input type="file" name="file2"/><br/>

     <input type="submit" name="submit"/>

    

   </form>

4)在result.jsp文件中使用EL表达式显示返回信息

    username: ${requestScope.username }<br/>

    password: ${requestScope.password }<br/>

    file1:${requestScope.file1 }<br/>

    fiel2:${requestScope.file2 }

    

    

5)编写UploadServlet.java文件,代码如下:

  1. @SuppressWarnings( { "deprecation""unchecked" })
  2.     public void doPost(HttpServletRequest request, HttpServletResponse response)
  3.             throws ServletException, IOException {
  4.         DiskFileItemFactory factory = new DiskFileItemFactory();  //磁盘文件项目工厂
  5.         String path = request.getRealPath("/upload"); //获取实时路径为"/upload",其中根目录为WebRoot
  6.         factory.setRepository(new File(path));  //大于设定的阈值大小的文件暂时存放目录
  7.         factory.setSizeThreshold(1024 * 1024);  //设置的大小超出该指定值,则直接写到磁盘
  8.         ServletFileUpload upload = new ServletFileUpload(factory);  
  9.         //上传文件中最重要的类,处理上传文件信息
  10.         try {
  11.             List<FileItem> list = upload.parseRequest(request);  //请求的Servlet的请求解析
  12.             // @return A list of <code>FileItem</code> instances parsed from the
  13.             // request, in the order that they were transmitted.
  14.             
  15.             //使用循环遍历list
  16.             for (FileItem item : list) {
  17.                 //一个item对应于表单中的一项
  18.                 if (item.isFormField()) { //判断item是一般的form字段还是file字段
  19.                     //如果是一般字段则运行下面的代码,否则运行else语句中的语句
  20.                     String name = item.getFieldName(); //获取属性名
  21.                     String value = item.getString("utf-8"); //通过一种编码格式获取属性值
  22.                     request.setAttribute(name, value); //将name属性名和value属性值放置到request的属性中
  23.                     //将来使用EL表达式进行读取
  24.                 } else {
  25.                     String name = item.getFieldName(); //获取field名
  26.                     String value = item.getName(); //获取field属性值
  27.                     //下面代码用于解析文件名,因为有的浏览器在进行文件上传的时候,将文件的路径与文件名都包含进去,
  28.                     //而有的浏览器在进行文件上传的时候,仅包含文件名,所以需要进行解析
  29.                     int start = value.lastIndexOf("//"); //获取file中最后"/"的出现位置
  30.                     //在最后"/"后面接的是文件名
  31.                     String fileName = value.substring(start + 1); //获取文件名,从最后出现斜杠的位置后开始读取字符串
  32.                     request.setAttribute(name, fileName); //将name属性名和文件名放置到request的属性中
  33.                     //将来使用EL表达式进行读取
  34.                     
  35.                     //第一个方法,一个简便的上传文件方法,可以代替下面的语句
  36.                     
  37.                     //方便的方法写上载的项目到磁盘。客户端代码不关心与否的项目是储存在内存中,或
  38.                     //磁盘在一个临时位置。他们只想写上载项目到一个文件中。
  39. //                  try {
  40. //                      item.write( new File(path,fileName) );
  41. //                  } catch (Exception e) {
  42. //                      e.printStackTrace();
  43. //                  }
  44.                     //比较复杂的上传文件的方法,第二个方法
  45.                     //新建一个输出流,         格式为文件输出流    建立一个File对象构造方法节中加入文件路径和文件名
  46.                     OutputStream os = new FileOutputStream(new File(path,
  47.                             fileName));
  48.                     //建立一个输入流,从item中获取输入流
  49.                     InputStream is = item.getInputStream();
  50.                     //将输入流中的信息方法输出流中
  51.                     byte[] buffer = new byte[400];//定义一个字节数组,缓冲400
  52.                     int length = 0;
  53.                     while ((length = is.read(buffer)) > 0) { //length大于0,表示还有内容
  54.                         os.write(buffer, 0, length); //将buffer中的信息,写出,起始位置0,长度length
  55.                     }
  56.                     is.close(); //关闭输入流
  57.                     os.close(); //关闭输出流
  58.                 }
  59.             }
  60.             //请求转发到result.jsp页面中,将request和response都传到result.jsp中
  61.             request.getRequestDispatcher("/upload/result.jsp").forward(request,
  62.                     response);
  63.         } catch (FileUploadException e) {
  64.             e.printStackTrace();
  65.         }
  66.     }
  67. }

 

6)注释掉wem.xml文件中的filter元素,本实例是非基于struts2的编程。

7)运行。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值