Struts2上传

Struts2上传

1. 文件上传的原理:

表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:

1) application/x-www-form-urlencoded:这是默认编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式。

2) multipart/form-data:这种编码方式的表单会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里。

3) text/plain:这种方式主要适用于直接通过表单发送邮件的方式。



文件上传原理是,通过为表单元素设置enctype=”multipart/form-data”属性,让表单提交的数据以二进制编码的方式提交,在接收此请求的Servlet中用二进制流来获取内容,就可以取得上传文件的内容,从而实现文件的上传。





Java领域中,有两个常用的文件上传项目:

一个是Apache组织Jakarta的Common-FileUpload组件;

http://commons.apache.org/fileupload/

另一个是Oreilly组织的COS框架;

http://www.servlets.com/cos/

利用这两个框架都能很方便的实现文件的上传。

2. Struts2的文件上传:

Struts2并未提供自己的请求解析器,也就是就Struts2不会自己去处理multipart/form-data的请求,它需要调用其他请求解析器,将HTTP请求中的表单域解析出来。但Struts2在原有的上传解析器基础上做了进一步封装,更进一步简化了文件上传。

Struts2默认使用的是Jakarta的Common-FileUpload框架来上传文件,

因此,要在web应用中增加两个Jar文件:commons-fileupload-1.2.jar和commons-io-1.3.1.jar。它在原上传框架上做了进一步封装,简化了文件上传的代码实现,取消了不同上传框架上的编程差异。

将文件上传组件的JAR文件复制到项目的classpath路径下。

如果要改成其它的文件上传框架,可以修改struts.multipart.parser常量的值为cos/pell,默认值是jakata。并在classpath中增加相应上传组件的类库。



步骤一:创建带上传表单域的页面

页面特殊之处只是把表单的enctype属性设置为multipart/form-data。

method="POST"

<input type="file" name="upload" />

步骤二:创建处理上传请求的Action类

Strut2的Action类直接通过File类型属性直接封装了上传文件的文件内容,但这个File属性无法获取上传文件的文件名和文件类型,所以Struts2就直接将文件域中包含的上传文件名和文件类型的信息封装到uploadFileName和uploadContentType属性中,也就是说Struts2针对表单中名为xxx的文件域,在对应的Action类中使用3个属性来封装该文件域信息:

l 类型为File的xxx属性:用来封装页面文件域对应的文件内容。

l 类型为String的xxxFileName属性:用来封装该文件域对应的文件的文件名。

l 类型为String的xxxContentType属性:用来封装该文件域应用的文件的文件类型。

步骤三:配置Struts.xml

<action name="photo_add" class="neo.photo.action.PhotoAction" method="add">

<interceptor-ref name="fileUploadStack" />

<interceptor-ref name="validationWorkflowStack" />

</action>
 



Struts 2文件下载

步骤一:Action类

private InputStream inputStream;



public InputStream getInputStream() {

return inputStream;

}

public String xxx() throws Exception {

inputStream = new FileInputStream(getServletContext().getRealPath());

……

……

return SUCCESS;

}
 

文件下载,编写一个普通的Action就可以了,只需要提供一个返回InputStream流的方法,该输入流代表了被下载文件的入口,这个方法用来给被下载的数据提供输入流,意思是从这个流读出来,再写到浏览器那边供下载。这个方法需要由开发人员自己来编写,只需要返回值为InputStream即可。



步骤一:配置Struts.xml



<action name="photo_show" class="neo.photo.action.PhotoAction" method="viewPhoto">

<result name="success" type="stream">

<param name="inputName">inputStream</param>

<param name="contentType">${photoFileContentType}</param>

<param name="contentDisposition">

filename="${photoFileFileName}

</param>

</result>

</action>
 

这个action特殊的地方在于result的类型是一个流(stream),配置stream类型的结果时,因为无需指定实际的显示的物理资源,所以无需指定location属性,只需要指定inputName属性,该属性指向被下载文件的来源,对应着Action类中的某个属性,类型为InputStream。下面则列出了和下载有关的一些参数列表:



参数说明

contentType

内容类型,和互联网MIME标准中的规定类型一致,例如text/plain代表纯文本,text/xml表示XML,image/gif代表GIF图片,image/jpeg代表JPG图片

inputName

下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取值为inputStream的属性需要编写getInputStream()方法

contentDisposition

文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。取值为:

attachment;filename="struts2.txt",表示文件下载的时候保存的名字应为struts2.txt。如果直接写filename="struts2.txt",那么默认情况是代表inline,浏览器会尝试自动打开它,等价于这样的写法:inline; filename="struts2.txt"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值