ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:26.35KB ,
资源ID:5979818      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5979818.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Struts2 File Upload and Download.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Struts2 File Upload and Download.docx

1、Struts2 File Upload and DownloadStruts2 File Upload and Download上一篇 / 下一篇 2010-04-15 22:42:06 / 个人分类:JEE 查看( 693 ) / 评论( 0 ) / 评分( 0 / 0 ) 记得自己当年自学JSP的时候看到文件上传和下载的时候自己很激动,因为基本上任何系统里面都或有这个功能模块,所以当时就看的很仔细,当初还使用的是SmartUpload,当自己后来慢慢的接触后,逐步对文件的上传和下载有了重新的认识和体会,目前主要使用的MVC开源架构是Struts,所以这里笔者就以Struts2为例,讲解下关

2、于Struts2的文件上传和下载的机制。 如果大家要使用struts2的文件上传功能那么需要导入commons-fileupload.jar和commons-io.jar文件,如果你使用的是Struts2的最小依赖包,这里可以不用再额外导入! 我们首先看下struts2默认支持的有那些开源的第三方的文件上传和下载,在struts的核心包中的default.properties中我们可以看到如下片段: # struts.multipart.parser=cos _y_t Y_d_P70 # struts.multipart.parser=pell_c) H7x: _/;D0 struts.mul

3、tipart.parser=jakarta中文JAVA技术网-Z_n/S+_km(_f_? # uses javax.servlet.context.tempdir by default中文JAVA技术网!&X#;M_H_X_M+v1W7v_q$c struts.multipart.saveDir=G3k:Q ws J0 struts.multipart.maxSize=2097152#在properties中代表注释,其中cos是著名的Oreilly组织开发的,这里大家可以获取以下几点信息: 1、properties中的注释怎么写? 2、struts2默认都支持哪几种文件上传和下载 3、上传

4、文件的临时目录默认是没有的 4、struts2的默认上传和下载使用的是jakarta下的commons-fileupload组件,最大允许一次上传的文件大小为2M多一点(配置中以字节为单位)!当然了大家如果要使用其他的上传组件,可以将相关的语句注释删除,给默认的添加#,并导入相关的jar就可以了,这就是struts2的灵活性!在讲具体的文件上传的时候大家要考虑一个问题: 当一个参数是文件时,传统的表单字段是否可行?传统表单字段值的获取方式是否可行?很明显传统的获取表单的一套方法这里已经不可使用了,因为文件是二进制字节流,所以这里先给大家讲解下基于web的几种字段编码方式: 1、 applica

5、tion/x-www-form-urlencoded 我们一般的默认的使用的编码方式 URL编码 2、 multipart/form-data主要用于以二进制流的方式传输表单字段的数据 3、 text/plain 主要用于直接通过表单发送邮件 如:mailto: 所以这里大家在做文件的时候一定要清楚一点你的表单的编码方式一定要采用第2种,否则就会出现问题! Struts2上传页面upload.jsp9.B-h E0|0 _S_v0x,r,G70 中文JAVA技术网_Q8s_c_P 中文JAVA技术网_Q K/O3W_ 中文JAVA技术网_b_X_X_b_w7j$I a 这里笔者故意设置了一个一

6、般字段和多个文件字段(2), 因为笔者在刚开始使用SmartUpload的时候就遇到这样的问题,如果上传的文件字段和一般的普通表单字段放在一起的时候不能获取一般的表单字段,当初刚使用SmartUpload的时候没有看它的API,后面有时间看的时候才发现要使用组件自带的request对象,随意这里大家就要注意struts2的文件上传了。第二点是直接看下struts2对文件的批量上传的处理,有些人就不明白了?为什么要直接讲多文件上传呢? 呵呵,因为在struts2中单个文件上传和多文件的上传是一致的,只要会一个,另一个就显的很简单了! 处理的文件上传的action:UploadAction.jav

7、a public class UploadAction extends ActionSupport中文JAVA技术网_m2?,_X_F9m) private List upload;中文JAVA技术网 n_E_!Y J%_H k1M9CV4a_p_F private String path;中文JAVA技术网_y_e_R_ p,m_7 private String info;中文JAVA技术网-M/T_g_E Eu_a &a private List uploadContentType;中文JAVA技术网5R1?_J&o$L1Vprivate List uploadFileName; / 当然

8、这里可以使用数组get、set(); public String getPath() 中文JAVA技术网_z_b_S!m_K&r_g return ServletActionContext.getRequest().getRealPath(path); / 获取存放路径的绝对路径中文JAVA技术网s/u_V u_ClG public void upload(int i) throws Exception中文JAVA技术网0Z_,w_n+b_g Q_B eInputStream fio=new FileInputStream(upload.get(i);中文JAVA技术网9x0E_w$m3t:D

9、;7d_MOutputStream fou=new FileOutputStream(getPath()+uploadFileName.get(i);中文JAVA技术网;m k+o A;System.out.println(getPath()+upload.get(i).getName();:n,D_$T+B-_x0 byte buf=new byte1024;m/b_Ns/U)b_D_?_|0 int length=0;中文JAVA技术网_|p_T_r_|!O while(length=fio.read(buf)0)(l_c.J8W1_?j0 fou.write(buf,0,length);

10、4/(B:J_y_0 T|)E D_b_A0 注意上面在拼接输出文件的绝对路径的时候,文件名不要用upload.get(i).getName()!通过遍历用户的上传文件数目一个一个上传。 public String execute() throws Exception 中文JAVA技术网_S_Z(H_C_h_T+s for(int i=0;iupload.size();i+)中文JAVA技术网4a_,g8I+u)H;upload(i);0K+-y5_S_p_O0j%t0 _od g_x u)h0 return SUCCESS;_u*Y&W_aS:B8Y0 这里笔者要解释的是关于XXXFileN

11、ame和XXXContentType属性,至于upload属性和表单字段的对应,而且struts帮我们将用户上传的每个字段都分装为一个File对象,便于开发人员操作!注意的是在多文件上传时要注意每个textfield的name要相同,且与action的字段想匹配!struts为了方便开发人员会默认的将用户上传的文件的名字和类型分装在XXXFileName和XXXContentType中!细心的人们会发现action中的path是没有值的,所以这里就带大家去看下struts.xml文件: 中文JAVA技术网1d_L0L_z_n:ff,M /upload&)x_1Z8O,x_O0/success.

12、jsp中文JAVA技术网_j w_T_H/j%D(R1_ /index.jsp 在配置文件中通过DI来注入值,这样可以增强程序的灵活性!这里要提醒大家的是最好为action提供input视图,因为在很多情况下struts会默认找input视图,比如:校验、上传等! 此时你会看到你的上传文件后在服务器的日志中打印没有临时目录的消息,所以这里要设置 常量,或者在struts.propertes或者在web.xml中!仔细的人会发现临时目录是有struts维护的。 如何使用限制上传文件的大小和类型呢? 最佳的答案 文件上传拦截器(FileUploadInterceptor) 查看该拦截器的源代码片段

13、如下: protected Long maximumSize; / 文件的最大值y_v_z0f z_E;s0 protected Set allowedTypesSet = Collections.emptySet(); / 接受文件的类型所以这里可以给上传的action提供参数,来DI相关的参数!具体如下配置: 中文JAVA技术网,r j_w S8?4p image/jpg,image/JPEG中文JAVA技术网_R63?3qa5f:l 2000中文JAVA技术网_N_h_A#J2w_|,L3O_ *5?_O_A%w*m_v*c;W_0 这里我说过一旦我们的action显式的配置了拦截器,那

14、么strtus的拦截器就无效了,所以我们还有手工添加struts的默认拦截器栈,聪明的你估计会问默认的拦截器栈里面不是有这个拦截器吗?我们为什么还要自己配置呢? 呵呵! 问的好,这里配置是为了个拦截器加参数,如果开发人员配置的拦截器是struts默认拦截器有的,这里struts框架自己会判断该拦截器是否已经执行了,如果执行了,相同的拦截器就不会再次执行! 这里还要说明2点: 1、allowedTypes这个参数接受的是文件的MIME类型,不清楚的人可查看相关文档,这里笔者就不列举了!2、maximumSize单位是字节 此时的文件上传已经好了,但是当你上传的文件过大、或者没有在允许的范围内的话

15、,会出现一些显眼的英文,这就又涉及到了struts2的国际化了,查看struts-messages.properties文件,根据错误消息找到对应的消息的key值,开发人员自己建立资源文件加载其中的中文字段就OK啦! 通过上述大家已经可以掌握struts2的文件上传了,接下来我们讲解下下载: 其实如果说文件上传是文件的复制(输入-输出)的话,那么文件的下载就是文件的输出,所以当用户下载文件的时候从技术角度看,就是一个文件的输出流在通过缓存输出文件! 难道不是吗? 呵呵 但是这里大家要注意的是strus2帮我们提供好了输出流,所以在下载的时候我们要给输出流提供一个输入流! 既然是一个输入流那么就

16、要考虑2个问题: 1、文件位置+文件名 2、文件流的获取+返回 下载文件的action:DownloadAction.java public InputStream getDownloadFile() 中文JAVA技术网_l_a_g_l_x#S*L9W returnServletActionContext.getServletContext().getResourceAsStream(path+fileName); 中文JAVA技术网:O&WU_j_K-_j/?.b / path和fileName可以写死在程序中(硬编码)、或者注入进来(配置action时采用param)、请求参数传递过来中文

17、JAVA技术网_j*Z_z_ Z_i_J W!K-W_C_s4q)R_o0 中文JAVA技术网_i_S9G6N_R;y5 text/plain 中文JAVA技术网_v_T&_d_z.s_|_A0r.Q 中文JAVA技术网_m#Y_z5g_f 中文JAVA技术网/F_sk+R_oN_m_n.h+S J _x_m attachment;filename=jiao.txt|_H0q_L9n8b_I%m0 +C/G _C.j f. q_Z0 中文JAVA技术网.lc_O&8|_o;U7W downloadFile 中文JAVA技术网4_Z4I_BK2 中文JAVA技术网_q)m w_x_L:_K:g_

18、 contentType:下载文件的内容类型! contentDisposition:通知浏览器对于该文件的处理方式,默认是inline的,也就是在页面试图打开文件,这里采用附件的形式,通知浏览器给客户端提供一个保存窗口来另存为文件!inputName:告诉struts action中的哪个方法给输出流提供输入流。 这里的三个参数没有必要记忆,大家可以参考stream对应的Result查看源代码: protected String contentType = text/plain;_xD_D_M.E-S_B_z0 protected String contentLength;中文JAVA技术网

19、 %U_L_e)A_yi_K protected String contentDisposition = inline;:U(a_d _K_?_v9Z_F k0 protected String contentCharSet ;HHq_a.6b.p_Y0 protected String inputName = inputStream;中文JAVA技术网_V5A_x E&U Dh protected InputStream inputStream;+ _G_Z_? l0 protected int bufferSize = 1024;中文JAVA技术网5(M )m-E_v_h_X:j_u pr

20、otected boolean allowCaching = true; 此时大家就可以看到这些参数的默认值都是什么了!呵呵,这就是学习开源技术的一种手法,现在市场上的SSH书那么贵,对于学习者而言官方文档是最好的选择、也是最佳的选择! 不知道很多人都会遇到乱码问题,这里笔者告诉大家一个屡试不爽的方法: 1、和struts2保持统一的编码方式(默认是UTF-8) 2、获取用户的文件名后new String(name.getBytes(ISO-8859-1),UTF-8);到此struts2的文件上传和下载就讲完了,呵呵,写这个只是为了方便大家学习,有错误之处请不吝赐教,也希望大家提宝贵意见,如

21、果是高手请路过! 呵呵.闲暇之余随笔. 教学反馈: 学完了文件的上传和下载,struts2的基本知识和核心的知识基本就告一段落了,呵呵,今天学生在实验的时候遇到一个问题,问题描述:文件上传可以,而且上传的目录中可以正常显示中文的文件,但是在下载中文文件的时候遇到一个无效参数的问题:java.lang.IllegalArgumentException: Can not find a java.io.InputStream with the name downloadFile in the invocation stack. Check the tag specified for this act

22、ion.此时可以从错误中分析是由于下载时候的编码和中文冲突的问题! 这里要采用的是告诉浏览器在URL编码的时候如何编码,记得一般我们在配置Tomcat的时候都是会去配置两个文件: Tomcat的安装目录下的conf:server.xml和context.xml文件要添加如下的信息:server.xml: 这样使用URL编码是就会采用UTF-8的编码方式了! 当然了,对于实验的时候大家可能都采用的是Myeclipse自带的tomcat所以这里大家要去寻找自带的tomcat所在的路径,找到conf的配置文件,然后如上配置就OK啦,呵呵,感谢这位学生提出的问题! 教学反馈2: 在学生的上机实验中有同学想把上传的文件放在项目的根目录下,这个时候问我路径要怎么写?解决方案:上传的时候提供/路径为保存路径,同时在下载的时候也要设置相同的路径!这里推荐大家还是要把上传的文件统一按类放在不同的文件目录中,1、便于管理 2、便于下载 。还有就是有些人采用的是IE8的话文件在上传的时候默认会改变路径,所以大家要去在IE的选项中设置安全级别,详细见邮件开发的文章! 还有就是大家对于上传文件目录的建立可以直接在Web-Root目录下创建一个文件目

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1