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

举报
wh_bn 发表于 2021/12/15 23:43:16 2021/12/15
【摘要】   Struts2学习笔记14:Struts2的文件上传和下载【续】 第十二讲 学习内容: 通过实例,实现非基于struts2的文件上传 使用文件 下载地址: http://apache.mirror.phpchina.co...

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

 

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

7)运行。

文章来源: blog.csdn.net,作者:fengda2870,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/fengda2870/article/details/2971776

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。