第12章 文件的上传和下载_第1页
第12章 文件的上传和下载_第2页
第12章 文件的上传和下载_第3页
第12章 文件的上传和下载_第4页
第12章 文件的上传和下载_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第 12 章文件的上传和下载本章讲解了在 Java Web 应用程序中常用的文件上传技术。在 Java Web 应用程序中, 可以通过分析上传文件的数据格式来手工实现上传文件的功能,但这样会编写大量的代码, 而且代码的复用性不强。为此,apache 组织开发了一个用于上传文件的组件 Common-FileUpload,使用该组件可以非常容易地实现文件上能。 在 Struts 2 中对该组件进行了封装,使上传文件的过程更加透明。除此之外,Struts 2 还封装了一个叫 COS 的上传文件项目,在 Struts 2 中实现文件上传非常的简单,只需要在Action 类中加几个属性即可。 除此之外,

2、Struts 2 还提供了支持文件下载的 stream 结果类型,通过 Struts 2 提供的文件下载支持,可以实现非 ISO-8859-1 编码格式文件名的文件下载,而且可以在下载文件之前检查用户的权限,从而通过授权的方式来控制文件的下载。本章的主要内容如下: 表单数据的编码方式; 使用 Common-FileUpload 组件上个文件;使用 Common-FileUpload 组件上传多个文件;使用 Struts 2 上个文件; 过滤上传文件的类型; 上传文件的参数配置; 使用 Struts 2 上传固定数目的文件; 使用 Struts 2 上传任意数目的文件; Struts 2 的文件

3、下载支持; stream 类型的结果。 12.1文件上传原理在很多 Web 应用程序中都有上传文件的功能。上传文件从表面上看并不复杂,在客户端使用表单(form)以 multipart/form-data 编码格式向服务端发送要上传的文件字节流。服务端的程序读取这些字节流,并做进一步的处理。但很多开发人员在编写实际的上传文件程序时,往往会遇到各式各样的问题,归根结底,就是对上传文件的原理不了解。因此, 在本节将从上传文件的原理开始讲起,希望对读者彻底解决文件上传的问题有所帮助。 12.1.1表单数据的编码方式在大多数时候,不需要设置表单的 enctype 属性,一般只需要设置表单的 metho

4、d 和 第 12 章 文件的上传和下载 action 属性即可。其中 method 属性指定了是以 POST 方式还是以 GET 方式提交请求,action 属性指定了表单要提交的 URL。enctype 属性指定了表单数据的编码方式,该属性有如下所示的 3 个值。 text/plain:该编码方式指定了表单以文本方式发送请求。它主要适合直接使用表单发送电子邮件的方式(设置表单的 action 属性,如 action=mailto:? subject=xyz)。 application/x-www-form-urlencoded:这是默认的编码方式,该编码方式只处理表单域的

5、 value 属性值,并将表单域的值按照 URL 编码的方式处理。 multipart/form-data:该编码方式以二进制的方式来处理表单中的数据,这种编码 方式会把文件域所指定的文件内容也封装在请求中。 在 12.1.2 节和 12.1.3 两节将分别介绍 application/x-www-form-urlencoded 和 multipart/ form-data 编码方式所提交的数据格式。 12.1.2applicaiton/x-www.form-urlencoded 编码方式当表单使用 applicaiton/x-www.form-urlencoded 编码格式时,如果表单域的

6、value 属性值中包含非 ISO-8859-1 编码格式的字符,如中文字符,在提交时就会将这些非 ISO-8859-1 编码格式的字符转换成 URL 编码的格式,即%XX 的格式,其中 XX 表示一个字节的十六 进制形式。下面的 JSP 代码向服务端提交一个文件和一个请求参数,代码如下: 上面表单的 enctype 属性值是 application/x-www-form-urlencoded,这是 enctype 属性的默认编码方式,如果不指定 enctype 属性,表单仍然会采用该编码方式。 343上传文件:请求参数:Java Web 开发技术大全JSP+Servlet+Struts 2+

7、Hibernate+Spring+AJAX表单的 action 属性指定了一个 Servlet,该 Servlet 负责将由表单提交的请求信息输出到客户端。该 Servlet 类的代码如下: OutDataServlet 类的配置代码如下:为了演示文件上传的效果,在 D 盘建立一个“我的文档.txt”文件,该文件的内容 如下: 上传文件中的内容 在浏览器地址栏中输入如下的 URL: http:/localhost:8080/webdemo/chapter12/upload_app.jsp浏览器出现上传页面后,单击【浏览.】按钮,选择“我的文档.txt”文件,并在【请求参数】文本框中输入“中文请

8、求参数”,如图 12.1 所示。单击【提交】按钮,将输出如 图 12.2 所示的信息。 344OutDataServletchapter12.servlet.OutDataServletOutDataServlet/chapter12/OutDataServletpublic class OutDataServlet extends HttpServlet/ 处理 HTTP 请求的 service 方法 public void service(HttpServletRequest request, HttpServletResponse response)throws ServletExcep

9、tion, IOExceptionresponse.setContentType(text/html;charset=UTF-8);/ 设置 Content-Type 字段值PrintWriter out = response.getWriter(); / 获得 PrintWriter 对象InputStream is = request.getInputStream(); / 得到获得请求信息的 InputStream 对象 / 通过 InputStream 对象获得 InputStreamReader 对象 InputStreamReader isr = new InputStreamRe

10、ader(is);/ 通过 InputStreamReader 对象获得 BufferedReader 对象BufferedReader br = new BufferedReader(isr); String requestData = ;String s = ;/ 开始读取请求信息 while(s = br.readLine() != null)requestData += s;out.println(requestData);/ 向客户端输出请求信息 第 12 章 文件的上传和下载 图 12.1 上传文件页面 图 12.2 输出请求信息 从图 12.2 所示的输出信息可以看出,所有表单域

11、的 value 值中的中文字符都按照 URL 编码格式进行编码了,如“中文请求参数”被转换成了如下的格式 %E4%B8%AD%E6%96%87%E8%AF%B7%E6%B1%82%E5%8F%82%E6%95%B0从这个编码结果可以看出,“中文请求参数”是按照 UTF-8 格式编码的。这是因为在 UTF-8 编码中,一个汉字由三个字节组成,而上面的编码正好由 18 个字节组成(有 18 个 %号)。如果将 upload_app.jsp 页面的编码格式改成 GBK(修改 pageEncoding 属性的值), 那么value 值中的中文字符将会以 GBK 的编码格式进行编码,读者可以自己去做这个

12、实验。 如果要想对该 URL 编码进行解码也非常简单,只需要调用 .URLDecoder.decode方法即可,代码如下: 其中 requestData 表示未解码的字符串,也就是图 12.2 中显示的信息。如果解码后再输出请求参数,则会看到如图 12.3 所示的信息。 图 12.3 输出解码后的请求参数 从图 12.3 可以清晰地看到,输出的信息只有两个请求参数和它们的值,并没有“我的文档.txt”文件中的内容,这是由于采用 application/x-www-form-urlencoded 编码方式提交表单时,并不会将上传文件的内容封装在请求参数中,如果要封装上传文件的内容

13、,就必 须使用 12.1.3 节要讲的 multipart/form-data 编码方式。 12.1.3multipart/form-data 编码方式如果表单使用 multipart/form-data 编码方式,可以将上传文件的内容封装在请求参数 345String decodedRequestData = .URLDecoder.decode(requestData, UTF-8);Java Web 开发技术大全JSP+Servlet+Struts 2+Hibernate+Spring+AJAX中。下面的 JSP 页面使用了 multipart/form-data 编码方

14、式来提交表单,代码如下:上面表单的 enctype 属性值是 multipart/form-data,表示将以 multipart/form-data 编码格式提交表单。以该编码格式提交表单时,value 属性值并不会按照 URL 格式进行编码,而是直接按照 GBK 或 UTF-8 编码格式进行编码(根据 JSP 页面的编码格式决定采用哪一种编码格式来对 value 属性值进行编码)。在上面的 JSP 页面中采用了 UTF-8 编码格式,因此,表单提交的数据将以 UTF-8 格式进行编码。 由于表单提交的数据未使用 URL 格式进行编码,因此,处理提交数据的 Servlet 也需要修改一下。上

15、面表单中的 action 属性所指定的就是修改后的 Servlet。在该 Servlet 中输出了请求消息头和请求消息正文,代码如下: 346public class OutMultipartDataServlet extends HttpServletpublic void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOExceptionresponse.setContentType(text/html;charset=UTF-8);/ 设置 Conten

16、t-Type 响应消息头 PrintWriter out = response.getWriter();/ 获得 PrintWriter 对象 InputStream is = request.getInputStream();/ 获得 InputStream 对象 / 通过 InputStream 对象获得 InputStreamReader 对象 InputStreamReader isr = new InputStreamReader(is, UTF-8);/ 通过 InputStreamReader 对象获得 BufferedReader 对象BufferedReader br = n

17、ew BufferedReader(isr); String requestData = ;String s = ;上传文件:请求参数:第 12 章 文件的上传和下载 由于表单提交的是 UTF-8 编码格式的二进制数据,因此,在上面的代码中读取请求消息时要使用 UTF-8 编码格式(通过 InputStreamReader 类的构造方法的第二个参数指定编码格式)。 注意:由于请求参数和文件名都是以 UTF-8 格式编码的,因此,“我的文档.txt”文件也应以 UTF-8 格式保存(读者可以使用 Windows 记事本打开该文件,并将其保存成 UTF-8 编码格式)。同时还要注意,如果表单采用了

18、 multipart/form-data 编码方式提交数据,在 Servlet 中无法使用 HttpServletRequest 接口的 getParameter 方法获得请求参数值,也就是说,使用 getParameter 方法获得任何的请求参数值都 为 null 。 在浏览器地址栏中输入如下的 URL: http:/localhost:8080/webdemo/chapter12/upload_multipart.jsp在出现和图 12.1 相同的页面后,单击【浏览.】按钮选择“我的文档.txt”文件,并在【请求参数】文本框中输入“中文请求参数”,然后单击【提交】按钮,将会输出如图 12.

19、4 所示的信息。 从图 12.4 输出的信息可以看出,在消息正文中输出了上传文件的内容,而且每个表单域使用“7d81481e420a38”来分隔。这个分隔行可以从请求消息头的 content-type 字段的 boundary 属性获得。在服务端分析上传文件的数据格式时,就可以通过这个 boundary 属性的值将不同的表单域分开,以便找到相应的上传文件域,并处理上传文件的内容。而且在请求消息中的上传文件域部分还使用了 filename 属性将上传文件的名字提交给了服务端。因此,在服务端仍然可以采用该文件名来保存上传的文件。 虽然可以通过采用手工分析上传文件的数据格式的方式来实现上传文件的工作

20、,但需要编写大量的代码,而在一般的基于 Web 的上传文件功能都是使用上传组件来完成的,如在 12.2 节要讲的 Common-FileUpload 组件,这些上传文件组件可以使分析上传文件数据的 工作变得透明,从而大大减少编写代码的工作量。 347java.util.Enumeration headers = request.getHeaderNames();/开始输出请求消息头out.println( 请 求 消 息 头 ); while(headers.hasMoreElements()String header = headers.nextElement();/ 获得请求消息头字段 o

21、ut.println(header + : + request.getHeader(header) + );/ 输出请求消息头字段和字段值 out.println();out.println(请求消息正文);/ 开始输出请求消息正文 while(s = br.readLine() != null)requestData = requestData + s + ;out.println(requestData);/ 向客户端输出消息正文 Java Web 开发技术大全JSP+Servlet+Struts 2+Hibernate+Spring+AJAX图 12.4 输出 multipart/for

22、m-data 编码方式提交的数据 12.2使用 Commons-FileUpload 上传文件Commons-FileUpload 是 apache 组织开发的一个用于上传文件的组件,通过该组件,用户可以很容易地上传一个或多个文件。在 Struts 2 中的上传中, 也可以使用Commons-FileUpload 组件来上传文件。在本节将介绍一下如何使用该组件来上传一个或多 个文件。 12.2.1下载和安装Commons-FileUpload 组件Commons-FileUpload 组件是 apache 的 Commons 组件包中的一个组件,读者可以通过如下的 URL 来下载 Common

23、s-FileUpload 的最新版本。 /fileupload/Commons-FileUpload 组件目前的最新版本是 1.2.1,在解开压缩包后,需要在 MyEclipse348第 12 章 文件的上传和下载 的 webdemo 工程中引用 commons-fileupload-1.2.1.jar 文件。 Commons-FileUpload 组件还依赖一个 Commons-IO 组件,该组件可以从如下的 URL 下载最新的版本: /io/Commons-IO 组件目前的最新版本是 1.4。在

24、解开压缩包后,需要在 MyEclipse 的 webdemo 工程中引用 commons-io-1.4.jar 文件。 12.2.2实例:上个文件使用 Commons-FileUpload 上个文件非常简单。在 JSP 页面中只需要提供一个 ,并且将表单的 enctype 属性值设为“multipart/form-data”即可。 uploadservlet.jsp 页面负责采集上传文件的信息,该页面有一个输入上传文件的文本框和一个输入新文件名的文本框。如果用户不输入新文件名,则保存在服务端的文件名和客户端的上传文件名相同,如果用户输入新文件名,则服务端采用这个新输入的文件名来保存上传的文件。

25、uploadservlet.jsp 页面的代码如下: 其中 UploadServlet 是一个 Servlet 类,负责处理由 uploadservlet.jsp 提交的请求。这个 Servlet 类的实现代码如下: 349public class UploadServlet extends HttpServletpublic void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOExceptiontryrequest.setCharacterEncodi

26、ng(UTF-8);/ 设置处理请求参数的编码格式 response.setContentType(text/html;charset=UTF-8);/ 设置 Content-Type 字段值 PrintWriter out = response.getWriter();/ 下面的代码开始使用 Commons-UploadFile 组件处理上传的文件数据 FileItemFactory factory = new DiskFileItemFactory();/ 建立 FileItemFactory 对象 ServletFileUpload upload = new ServletFileUpl

27、oad(factory);上个文件上传文件:新文件名:Java Web 开发技术大全JSP+Servlet+Struts 2+Hibernate+Spring+AJAX350/ 分析请求,并得到上传文件的 FileItem 对象 List items = upload.parseRequest(request);/ 从 web.xml 文件中的参数中得到上传文件的路径 String uploadPath = this.getInitParameter(path);String filename = ;/ 上传文件保存到服务器的文件名 InputStream is = null;/ 当前上传文件

28、的 InputStream 对象 / 循环处理上传文件 for (FileItem item : items)/ 处理普通的表单域 if(item.isFormField()if (item.getFieldName().equals(filename)/ 如果新文件不为空,将其保存在 filename 中 if (!item.getString().equals() filename = item.getString(UTF-8);/ 处理上传文件 else if (item.getName() != null & !item.getName().equals()/ 从客户端发送过来的上传文

29、件路径中截取文件名 filename = item.getName().substring(item.getName().last- IndexOf() + 1);is = item.getInputStream();/ 得到上传文件的 InputStream 对象 / 将路径和上传文件名组合成完整的服务端路径 filename = uploadPath + filename;/ 如果服务器已经存在和上传文件同名的文件,则输出提示信息 if (new File(filename).exists()out.println(该文件已经存在,请为文件指定一个新的文件名!);/ 开始上传文件 else

30、 if (!filename.equals()/ 用 FileOutputStream 打开服务端的上传文件FileOutputStream fos = new FileOutputStream(filename); byte buffer = new byte8192;/ 每次读 8K 字节 int count = 0;/ 开始读取上传文件的字节,并将其输出到服务端的上传文件输出流中 while (count = is.read(buffer) 0)fos.write(buffer, 0, count); / 向服务端文件写入字节流 fos.close();/ 关闭FileOutputStr

31、eam 对象 is.close();/ InputStream 对 象 out.println(文件上传成功!);catch (Exception e)System.err.println(e.getMessage();第 12 章 文件的上传和下载 UploadServlet 类的配置代码如下:在浏览器的地址栏中输入如下的 URL: http:/localhost:8080/webdemo/chapter12/uploadservlet.jsp浏览器出现上传页面后,分别在【上传文件】文本框输入一个要上传的本地文件名, 并在【新文件名】文本框中输入一个新的文件名,如图 12.5 所示。 单击【

32、上传】按钮,如果上传文件成功,将会在上传文件路径(在本例中是 D:upload, 读者也可以设置其他的路径)中出现一个“你好吗.mp3”文件。如果在上传文件路径中已经存在同名的文件,则会出现如图 12.6 所示的提示信息。 图 12.5 上件单个文件的页面 图 12.6 文件名重复的提示信息 Commons-FileUpload 组件在处理上传文件的过程中,将每一个表单域封装在一个FileItem 对象中。这些表单域包括普通的表单域和文件域。FileItem 实际上是一个接口,该接口在 Commons-FileUpload 组件中被实现。可以通过 FileItem 接口的 isFormFiel

33、d 方法来判断当前的表单域是文件域,还是普通的表单域,如果 isFormField 方法返回 true,表明当前的 FileItem 对象封装的是普通的表单域,否则,封装的是文件域。在 FileItem 接口中还定义了如下所示的几个方法来获得表单域中的信息。 q getFieldName 方法:该方法用于获得表单域的 name 属性值。 q getString 方法:该方法用于获得表单 value 属性值,其中方法的参数用于设置 value属性值的编码格式。 351UploadServlet chapter12.servlet.UploadServletpathd:uploadUploadSe

34、rvlet/chapter12/UploadServletJava Web 开发技术大全JSP+Servlet+Struts 2+Hibernate+Spring+AJAXgetName 方法:该方法仅对文件域有效,用于返回上传文件的文件名。getContentType 方法:该方法仅对文件域有效,用于返回上传文件的文件类型。get 方法:该方法仅对文件域有效,用于返回上传文件的字节数组。 getInputStream 方法:该方法仅对文件域有效,用于返回上传文件对应的输入流。UploadServlet 类通过从初始化参数中读取上传文件在服务端保存的路径。并通过上述FileItem 接口中的方

35、法来获得上传文件的字节流,并判断服务器的上传文件保存路径中是否存在同名的文件,如果存在,则输出错误提示信息,要求用户重新输入一个文件名;如果不存在,则正常上传该文件。 由于 ServletFileUpload 的 parseRequest 方法后返回一个 List对象,该对象已经将客户端发送到服务端的所有表单域(包括普通表单域和文件域)封装在了多个 FileItem 对象中,并将这些 FileItem 对象放到了 List 对象中,因此,在这一步实际上文件已经上传完成了,只是这些文件被保存在了 Tomcat 的临时目录中,该目录的默认值是temp,读者可以通过如下的代码获得 Tomcat 的临

36、时目录: System.out.println(System.getProperty(java.io.tmpdir);使用getInputStream 方法获得的上传文件输入流实际上就是已经上传到Tomcat 临时目录中的上传文件的输入流,也就是说,该输入流所对应的文件已经是服务端的文件了。 12.2.3实例:上传任意多个文件上传多个文件和上个文件的基本原理是一样的,但需要做如下两个改进: q 在 JSP 页面中需要通过 JavaScript 动态生成文件域。 q 在 Servlet 类中需要考虑到处理多个文件域的问题,如文件名的命名规则。新建一个 uploadmoreservlet.jsp

37、页面,该页面可动态生成多个文件域,代码如下: 352上传多个文件/ 动态体检文件域(只使用于 IE) function addFile()/ 创建一个文件域 var uploadHTML = document.createElement( );/ 向 span 中添加一个文件域 document.getElementById(files).appendChild(uploadHTML);/ 创建一个标签 uploadHTML = document.createElement( );/ 向 span 中添加一个标签,使每一个文件域在单独一行 document.getElementById(fil

38、es).appendChild(uploadHTML);第 12 章 文件的上传和下载 从上面的代码可以看出,在标签中有一个标签,在该页面中通过 addFile 函数将文件域添加到标签中,作为标签的子标签。其中文件域的 name 属性可以是任意值,也可以没有 name 属性,因为在服务端的 Servlet 并不需要 name 属性。 UploadMoreServlet 类是处理上传多个文件的 Servlet,在该类中将当前的毫秒数作为上传文件的文件名。UploadMoreServlet 类的实现代码如下: 353public class UploadMoreServlet extends Ht

39、tpServlet/ 处理 HTTP 请求的 service 方法 public void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOExceptiontryrequest.setCharacterEncoding(UTF-8);/ 设置请求消息的编码格式 response.setContentType(text/html;charset=UTF-8);/ 设置 Content-Type 字段值PrintWriter out = response.get

40、Writer(); / 获得PrintWriter 对象FileItemFactory factory = new DiskFileItemFactory();/ 创建FileItemFactory 对象ServletFileUpload upload = new ServletFileUpload(factory); List items = upload.parseRequest(request);/ 分析请求消息 String uploadPath = this.getInitParameter(path);/ 从 Servlet 配置中获得上传文件的路径String filename

41、= ;/ 循环处理上传文件 for (FileItem item : items)if (!item.isFormField()filename = item.getName();/ 获得当前文件域中的上传文件名 / 当前文件域未输入文件名,则忽略此文件域 if(filename.equal() continue;/ 生成当前上传文件在服务端的文件名(以当前毫秒作为文件名) filename = uploadPath + System.currentTimeMillis()+ filename.substring(filename.lastIndexOf(.); FileOutputStrea

42、m fos = new FileOutputStream(filename);/ 如果该文件已经在内存中,直接通过文件的字节数组来保存 if (item.isInMemory()/ 一次性将上传文件的内容写到服务端的相应文件中 fos.write(item.get();Java Web 开发技术大全JSP+Servlet+Struts 2+Hibernate+Spring+AJAX从上面的代码可以看出,UploadMoreServlet 类通过 List对象获得所有的上传文件的 FileItem 对象,并依次处理它们。在该类中的实现比较简单,读者在编写上传文件程序时,也可以采用更复杂的逻辑,如

43、为每个上传文件指定新的文件名等。在浏览器中输入如下的 URL: http:/localhost:8080/webdemo/chapter12/uploadmoreservlet.jsp浏览器出现上传文件页面时,单击【添加文件】按钮,增加几个文件域,并输入本地要上传文件的文件名,如图 12.7 所示。 图 12.7 上传多个文件的页面 单击【上传】按钮,在 D:upload 目录将出现 3 个以当前毫秒作为文件名的文件。354elseInputStream is = item.getInputStream();/ 获得上传文件的输入流byte buffer = new byte8192;/ 每次

44、读 8K 字节int count = 0;while (count = is.read(buffer) 0)/ 向服务端的上传文件写入客户端上传的文件的字节流 fos.write(buffer, 0, count);is.close();/ 关闭上传文件的输入流对象 / 关闭服务端上传文件的文件输出流对象 fos.close();out.println(文件上传成功!);catch (Exception e)System.err.println(e.getMessage();第 12 章 文件的上传和下载 注意:笔者发现如果 Web 应用程序中安装了 Struts 2,本例无法正常工作,因此,

45、读者在运行本例时,可以先将 web.xml 文件中安装 Struts 2 框架的部分注释掉。不过也不必担心,本例只是为了演示 Commons-FileUpload 的功能,如果 Web 应用程 序中使用了 Struts 2 框架,建议读者使用 Struts 2 中的上 能。 12.3实例:Struts 2 的文件上传Struts 2 并未提供自己的上传文件组件,也就是说,它自己并不具备上传文件的功能, 但 Struts 2 却可以使用其他的上传文件组件,如 Commons-FileUpload、COS 等。Struts 2 为这些上传文件组件做了统一的接口,开发人员在使用它上传文件时,并不需要

46、知道这些上传组件的细节就可以轻松使用它们,甚至从一种上传文件组件切换到另外一种上传文件组 件,并不需要修改程序,而只需要修改配置文件即可。 12.3.1Struts 2 对上传文件的支持目前 Struts 2 支持 3 种上传文件组件:jakarta(Commons-FileUpload)、cos 和 pell。 这 3 种上传文件组件可以在 perties 文件中配置,如下面的代码所示: 除了文件上传解析器的配置外,在 perties 文件中还可以配置上传文件保存的临时目录以及上传文件总大小(以字节为单位),如下面的代码所示: 如果使用 Commons-FileUpload 上传组件,需要在 Eclipse 中引用 commons-io-1.4.jar 和 commons-fileupload-1.2.1.jar 文件,这一点和直接使用 Commons-FileUpload 上传组件相同。如果使用 cos 或 pell 上传组件,也需要在 Eclipse 中引用相应的 jar 包才可以正常使用。 12.3.2编写上传文件的 JSP 页上传文件的 JSP 页面和 12.2.2 节所给出的上传文件页面的功能相同,只是本节所给出 的 JSP 页面采用了 Struts 2 标签来实现,代码如下: 355# 设置保存上传文件的临时目录 s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论