yxhxj2006
導(dǎo)航
BlogJava
首頁(yè)
新隨筆
聯(lián)系
聚合
管理
<
2012年8月
>
日
一
二
三
四
五
六
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
留言簿
(7)
給我留言
查看公開(kāi)留言
查看私人留言
隨筆分類
J2EE(17)
(rss)
java(13)
(rss)
Javascipt
(rss)
Linux(3)
(rss)
PHP(4)
(rss)
SQL(12)
(rss)
勵(lì)志(3)
(rss)
測(cè)試
(rss)
文章分類
paypal
(rss)
隨筆檔案
2016年6月 (1)
2015年12月 (1)
2015年11月 (1)
2015年10月 (1)
2015年8月 (1)
2015年6月 (1)
2015年5月 (3)
2015年4月 (6)
2015年3月 (1)
2015年2月 (4)
2015年1月 (4)
2014年12月 (6)
2014年11月 (1)
2014年9月 (3)
2014年6月 (2)
2014年5月 (5)
2014年4月 (3)
2014年3月 (3)
2014年2月 (15)
2014年1月 (11)
2013年12月 (1)
2013年11月 (8)
2013年10月 (6)
2013年9月 (2)
2013年8月 (19)
2013年7月 (1)
2013年6月 (1)
2013年5月 (3)
2013年4月 (3)
2013年3月 (5)
2012年12月 (3)
2012年11月 (4)
2012年10月 (1)
2012年9月 (25)
2012年8月 (54)
2012年7月 (10)
2012年6月 (7)
閱讀排行榜
1.?Hibernate實(shí)現(xiàn)有兩種配置,xml配置與注釋配置(49848)
2.?公鑰與私鑰 (42387)
3.?使用POI讀取EXCEL中的所有Sheet表 (25905)
4.?Maven實(shí)戰(zhàn)(六)依賴(11942)
5.?Oracle中把一個(gè)查詢結(jié)果插入到一張表中(11031)
評(píng)論排行榜
1.?公鑰與私鑰 (31)
2.?Hibernate實(shí)現(xiàn)有兩種配置,xml配置與注釋配置(4)
3.?Java通過(guò)URL獲取網(wǎng)站Html源代碼 (3)
4.?讓HTML中的文本框中的文字垂直居中 .(3)
5.?struts2表單傳值(2)
常用鏈接
我的隨筆
我的評(píng)論
我的參與
最新評(píng)論
統(tǒng)計(jì)
隨筆 - 228
文章 - 0
評(píng)論 - 53
引用 - 0
最新評(píng)論
1.?re: 公鑰與私鑰
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--chinaltang
2.?re: 如何在magento中建立自定義頁(yè)面
請(qǐng)問(wèn)站長(zhǎng),你這個(gè)增加以下片段是在哪里增加的,還有你這是怎么顯示出來(lái)頁(yè)面呢,總要點(diǎn)擊頁(yè)面上的哪個(gè)東西跳轉(zhuǎn)到這個(gè)頁(yè)面吧,那點(diǎn)擊跳轉(zhuǎn)怎么操作
--王小丫
3.?re: 公鑰與私鑰
343434
--zhangsa
4.?re: 公鑰與私鑰
真的寫(xiě)的非常好,通俗易懂,但是不知道有demo沒(méi)有,要是有求一份。
--Divella
5.?re: Hibernate實(shí)現(xiàn)有兩種配置,xml配置與注釋配置[未登錄](méi)
sa
--sa
Struts2文件的上傳和下載
1
. 文件上傳的原理:
表單元素的enctype屬性指定的是表單數(shù)據(jù)的編碼方式,該屬性有3個(gè)值:
1
) application
/
x
-
www
-
form
-
urlencoded:這是默認(rèn)編碼方式,它只處理表單域里的value屬性值,采用這種編碼方式的表單會(huì)將表單域的值處理成URL編碼方式。
2
) multipart
/
form
-
data:這種編碼方式的表單會(huì)以二進(jìn)制流的方式來(lái)處理表單數(shù)據(jù),這種編碼方式會(huì)把文件域指定文件的內(nèi)容也封裝到請(qǐng)求參數(shù)里。
3
) text
/
plain:這種方式主要適用于直接通過(guò)表單發(fā)送郵件的方式。
文件上傳是web應(yīng)用經(jīng)常用到的一個(gè)知識(shí)。原理是,通過(guò)為表單元素設(shè)置enctype
=
”multipart
/
form
-
data”屬性,讓表單提交的數(shù)據(jù)以二進(jìn)制編碼的方式提交,在接收此請(qǐng)求的Servlet中用二進(jìn)制流來(lái)獲取內(nèi)容,就可以取得上傳文件的內(nèi)容,從而實(shí)現(xiàn)文件的上傳。
在Java領(lǐng)域中,有兩個(gè)常用的文件上傳項(xiàng)目:一個(gè)是Apache組織Jakarta的Common
-
FileUpload組件(http:
//
commons.apache.org/fileupload/),另一個(gè)是Oreilly組織的COS框架(
http://www.servlets.com/cos/
)。利用這兩個(gè)框架都能很方便的實(shí)現(xiàn)文件的上傳。
2
. Struts2的文件上傳:
Struts2并未提供自己的請(qǐng)求解析器,也就是就Struts2不會(huì)自己去處理multipart
/
form
-
data的請(qǐng)求,它需要調(diào)用其他請(qǐng)求解析器,將HTTP請(qǐng)求中的表單域解析出來(lái)。但Struts2在原有的上傳解析器基礎(chǔ)上做了進(jìn)一步封裝,更進(jìn)一步簡(jiǎn)化了文件上傳。
Struts2默認(rèn)使用的是Jakarta的Common
-
FileUpload框架來(lái)上傳文件,因此,要在web應(yīng)用中增加兩個(gè)Jar文件:commons
-
fileupload
-
1.2
.jar和commons
-
io
-
1.3
.
1
.jar。它在原上傳框架上做了進(jìn)一步封裝,簡(jiǎn)化了文件上傳的代碼實(shí)現(xiàn),取消了不同上傳框架上的編程差異。
如果要改成其它的文件上傳框架,可以修改struts.multipart.parser常量的值為cos
/
pell,默認(rèn)值是jakata。并在classpath中增加相應(yīng)上傳組件的類庫(kù)。
2.1
. 步驟一:創(chuàng)建帶上傳表單域的頁(yè)面
<%
@ page language
=
"
java
"
contentType
=
"
text/html; charset=UTF-8
"
%>
<
html
>
<
head
>
<
title
>
Struts2 File Upload
</
title
>
</
head
>
<
body
>
<
form action
=
"
fileUpload.action
"
method
=
"
POST
"
enctype
=
"
multipart/form-data
"
>
文件標(biāo)題:
<
input type
=
"
text
"
name
=
"
title
"
size
=
"
50
"
/><
br
/>
選擇文件:
<
input type
=
"
file
"
name
=
"
upload
"
size
=
"
50
"
/><
br
/>
<
input type
=
"
submit
"
value
=
"
上傳
"
/>
</
form
>
</
body
>
</
html
>
此頁(yè)面特殊之處只是把表單的enctype屬性設(shè)置為multipart
/
form
-
data。
2.2
. 步驟二:創(chuàng)建處理上傳請(qǐng)求的Action類
package
org.qiujy.web.struts2;
import
java.io.BufferedInputStream;
import
java.io.BufferedOutputStream;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileOutputStream;
import
java.io.InputStream;
import
java.io.OutputStream;
import
org.apache.struts2.ServletActionContext;
import
com.opensymphony.xwork2.ActionSupport;
/** */
/**
*處理文件上傳的Action類
*@authorqiujy
*@version1.0
*/
publicclass FileUploadAction
extends
ActionSupport
{
privatestaticfinalintBUFFER_SIZE
=
16
*
1024
;
//
文件標(biāo)題
private
String title;
//
上傳文件域?qū)ο?/span>
private
File upload;
//
上傳文件名
private
String uploadFileName;
//
上傳文件類型
private
String uploadContentType;
//
保存文件的目錄路徑(通過(guò)依賴注入)
private
String savePath;
//
以下省略getter和setter
//
自己封裝的一個(gè)把源文件對(duì)象復(fù)制成目標(biāo)文件對(duì)象
privatestaticvoid copy(File src, File dst)
{
InputStream in
=
null
;
OutputStream out
=
null
;
try
{
in
=
new
BufferedInputStream(
new
FileInputStream(src), BUFFER_SIZE);
out
=
new
BufferedOutputStream(
new
FileOutputStream(dst),
BUFFER_SIZE);
byte
[] buffer
=
newbyte[BUFFER_SIZE];
int
len
=
0
;
while
((len
=
in.read(buffer))
>
0
)
{
out.write(buffer,
0
, len);
}
}
catch
(Exception e)
{
e.printStackTrace();
}
finally
{
if
(
null
!=
in)
{
try
{
in.close();
}
catch
(IOException e)
{
e.printStackTrace();
}
}
if
(
null
!=
out)
{
try
{
out.close();
}
catch
(IOException e)
{
e.printStackTrace();
}
}
}
}
@Override
public
String execute()
throws
Exception
{
//
根據(jù)服務(wù)器的文件保存地址和原文件名創(chuàng)建目錄文件全路徑
String dstPath
=
ServletActionContext.getServletContext()
.getRealPath(
this
.getSavePath())
+
"
\\
"
+
this
.getUploadFileName();
System.out.println(
"
上傳的文件的類型:
"
+
this
.getUploadContentType());
File dstFile
=
new
File(dstPath);
copy(
this
.upload, dstFile);
returnSUCCESS;
}
}
上面這個(gè)Action類中,提供了title和upload兩個(gè)屬性來(lái)分別對(duì)應(yīng)頁(yè)面的兩個(gè)表單域?qū)傩裕脕?lái)封裝表單域的請(qǐng)求參數(shù)。
但是,值得注意的是,此Action中還有兩個(gè)屬性:uploadFileName和uploadContentType,這兩個(gè)屬性分別用于封裝上傳文件的文件名、文件類型。這是Struts2設(shè)計(jì)的獨(dú)到之處:Strut2的Action類直接通過(guò)File類型屬性直接封裝了上傳文件的文件內(nèi)容,但這個(gè)File屬性無(wú)法獲取上傳文件的文件名和文件類型,所以Struts2就直接將文件域中包含的上傳文件名和文件類型的信息封裝到uploadFileName和uploadContentType屬性中,也就是說(shuō)Struts2針對(duì)表單中名為xxx的文件域,在對(duì)應(yīng)的Action類中使用3個(gè)屬性來(lái)封裝該文件域信息:
l 類型為File的xxx屬性:用來(lái)封裝頁(yè)面文件域?qū)?yīng)的文件內(nèi)容。
l 類型為String的xxxFileName屬性:用來(lái)封裝該文件域?qū)?yīng)的文件的文件名。
l 類型為String的xxxContentType屬性:用來(lái)封裝該文件域應(yīng)用的文件的文件類型。
另外,在這個(gè)Action類中還有一個(gè)savePath屬性,它的值是通過(guò)配置文件來(lái)動(dòng)態(tài)設(shè)置的,這也是Strut2設(shè)計(jì)中的一個(gè)依賴注入特性的使用。
2.3
. 步驟三:配置
struts.xml文件:
<!
DOCTYPE struts PUBLIC
"
-//Apache Software Foundation//DTD Struts Configuration 2.0//EN
"
"
http://struts.apache.org/dtds/struts-2.0.dtd
"
>
<
struts
>
<
package
name
=
"
fileUploadDemo
"
extends
=
"
struts-default
"
>
<
action name
=
"
fileUpload
"
class
=
"
org.qiujy.web.struts2.FileUploadAction
"
>
<!--
動(dòng)態(tài)設(shè)置Action中的savePath屬性的值
-->
<
param name
=
"
savePath
"
>/
upload
</
param
>
<
result name
=
"
success
"
>/
showupload.jsp
</
result
>
</
action
>
</
package
>
</
struts
>
在這個(gè)文件中跟以前配置唯一不同的是給action配置了一個(gè)
<
param …
/>
元素,用來(lái)為該Action的savePath屬性動(dòng)態(tài)注入值。
web.xml中的配置跟以前的應(yīng)用一樣。說(shuō)明一點(diǎn):好多網(wǎng)絡(luò)文章說(shuō)Struts2上傳時(shí)要在web.xml中配置一個(gè)名為ActionContextUp的過(guò)濾器,說(shuō)是有一些莫名的錯(cuò)誤,可是是我用了Struts2新版本2.
0
.9GA版,測(cè)了n次,沒(méi)出現(xiàn)什么問(wèn)題,所以沒(méi)配置。
2.4
. 運(yùn)行調(diào)試:
運(yùn)行前要在根目錄下創(chuàng)建一個(gè)名為upload的文件夾,用來(lái)存放上傳后的文件。
上傳結(jié)果:
3
. 文件類型及錯(cuò)誤輸出:
Struts2提供了一個(gè)文件上傳的攔截器(名為fileUpload),通過(guò)配置這個(gè)攔截器能輕松地實(shí)現(xiàn)文件類型的過(guò)濾。
在上例中,若要配置上傳的文件只能是一些普通的圖片文件格式:image
/
bmp、image
/
png、image
/
gif、image
/
jpeg、image
/
jpg等,則可在struts.xml文件中按如下方式配置:
<!
DOCTYPE struts PUBLIC
"
-//Apache Software Foundation//DTD Struts Configuration 2.0//EN
"
"
http://struts.apache.org/dtds/struts-2.0.dtd
"
>
<
struts
>
<
constant name
=
"
struts.custom.i18n.resources
"
value
=
"
messages
"
/>
<
package
name
=
"
fileUploadDemo
"
extends
=
"
struts-default
"
>
<
action name
=
"
fileUpload
"
class
=
"
org.qiujy.web.struts2.FileUploadAction
"
>
<
interceptor
-
ref name
=
"
fileUpload
"
>
<!--
配置允許上傳的文件類型,多個(gè)用
"
,
"
分隔
-->
<
param name
=
"
allowedTypes
"
>
image
/
bmp,image
/
png,image
/
gif,image
/
jpeg,image
/
jpg
,image
/
x
-
png, image
/
pjpeg
</
param
>
<!--
配置允許上傳的文件大小,單位字節(jié)
-->
<
param name
=
"
maximumSize
"
>
102400
</
param
>
</
interceptor
-
ref
>
<
interceptor
-
ref name
=
"
defaultStack
"
/>
<!--
動(dòng)態(tài)設(shè)置Action中的savePath屬性的值
-->
<
param name
=
"
savePath
"
>/
upload
</
param
>
<
result name
=
"
input
"
>/
index.jsp
</
result
>
<
result name
=
"
success
"
>/
showupload.jsp
</
result
>
</
action
>
</
package
>
</
struts
>
如果上傳文件失敗,系統(tǒng)返回到input對(duì)應(yīng)的頁(yè)面,要在input對(duì)應(yīng)的頁(yè)面輸出文件過(guò)濾失敗信息,可以在input對(duì)應(yīng)的頁(yè)面中增加
<
s:fielderror
/>
來(lái)顯示錯(cuò)誤信息。
運(yùn)行調(diào)試:
結(jié)果:
顯然,這樣的提示不太友好,應(yīng)用使用國(guó)際化信息。在國(guó)際化資源文件中添加如下三句:
#更改上傳文件類型不允許的提示信息
struts.messages.error.content.type.not.allowed
=
文件上傳失敗:你要上傳的文件類型不允許
#更改上傳文件太大的提示信息
struts.messages.error.file.too.large
=
文件上傳失敗:你要上傳的文件太大
#文件上傳其它錯(cuò)誤信息
struts.messages.error.uploading
=
文件上傳失敗:發(fā)生內(nèi)部錯(cuò)誤
別忘了要用native2ascii.exe進(jìn)行編碼轉(zhuǎn)換哦。再運(yùn)行調(diào)試:
另外,在控制臺(tái)會(huì)看到一條消息:
Unable to find
'
struts.multipart.saveDir
'
property setting. Defaulting to javax.servlet.context.tempdir
Removing file upload D:\tomcat6.
0.13
\work\Catalina\localhost\fileload_struts2\upload__4b616fd1_115a3d5d9dc__7fff_00000005.tmp
第一個(gè)說(shuō)是找不以struts.multipart.saveDir,即沒(méi)有指定臨時(shí)文件夾,這個(gè)很好解決,只需指定一個(gè)struts.multipart.saveDir常量值為某個(gè)目錄來(lái)解決。第二個(gè)說(shuō)正在刪除一個(gè)臨時(shí)文件,這個(gè)臨時(shí)文件是上傳過(guò)程中產(chǎn)生的,屬正常。
4
. 多文件上傳:
Struts2也可以很方便地實(shí)現(xiàn)多文件上傳。
在輸入表單域增加多個(gè)文件域:multifileupload.jsp
<%
@ page language
=
"
java
"
contentType
=
"
text/html; charset=UTF-8
"
%>
<%
@ taglib uri
=
"
/struts-tags
"
prefix
=
"
s
"
%>
<
html
>
<
head
>
<
title
>
多文件上傳
</
title
>
</
head
>
<
body
>
<
font color
=
"
red
"
><
s:fielderror
/></
font
>
<
form action
=
"
multiFileUpload.action
"
method
=
"
POST
"
enctype
=
"
multipart/form-data
"
>
文件標(biāo)題:
<
input type
=
"
text
"
name
=
"
title
"
size
=
"
50
"
value
=
"
${param.title }
"
/><
br
/>
<!--
設(shè)置二個(gè)文件域,名字相同
-->
選擇第一個(gè)文件:
<
input type
=
"
file
"
name
=
"
upload
"
size
=
"
50
"
/><
br
/>
選擇第二個(gè)文件:
<
input type
=
"
file
"
name
=
"
upload
"
size
=
"
50
"
/><
br
/>
<
input type
=
"
submit
"
value
=
"
上傳
"
/>
</
form
>
</
body
>
</
html
>
在Action類中用數(shù)組來(lái)封裝該多個(gè)文件域:MultiFileUploadAction.java
package
org.qiujy.web.struts2;
import
java.io.BufferedInputStream;
import
java.io.BufferedOutputStream;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.io.InputStream;
import
java.io.OutputStream;
import
org.apache.struts2.ServletActionContext;
import
com.opensymphony.xwork2.ActionSupport;
/** */
/**
*處理多文件上傳的Action類
*
*@authorqiujy
*@version1.0
*/
publicclass MultiFileUploadAction
extends
ActionSupport
{
privatestaticfinalintBUFFER_SIZE
=
16
*
1024
;
//
文件標(biāo)題
private
String title;
//
用File數(shù)組來(lái)封裝多個(gè)上傳文件域?qū)ο?/span>
private
File[] upload;
//
用String數(shù)組來(lái)封裝多個(gè)上傳文件名
private
String[] uploadFileName;
//
用String數(shù)組來(lái)封裝多個(gè)上傳文件類型
private
String[] uploadContentType;
//
保存文件的目錄路徑(通過(guò)依賴注入)
private
String savePath;
//
以下為所有屬性的getter和setter。省略。。。
//
自己封裝的一個(gè)把源文件對(duì)象復(fù)制成目標(biāo)文件對(duì)象
privatestaticvoid copy(File src, File dst)
{
InputStream in
=
null
;
OutputStream out
=
null
;
try
{
in
=
new
BufferedInputStream(
new
FileInputStream(src), BUFFER_SIZE);
out
=
new
BufferedOutputStream(
new
FileOutputStream(dst),
BUFFER_SIZE);
byte
[] buffer
=
newbyte[BUFFER_SIZE];
int
len
=
0
;
while
((len
=
in.read(buffer))
>
0
)
{
out.write(buffer,
0
, len);
}
}
catch
(Exception e)
{
e.printStackTrace();
}
finally
{
if
(
null
!=
in)
{
try
{
in.close();
}
catch
(IOException e)
{
e.printStackTrace();
}
}
if
(
null
!=
out)
{
try
{
out.close();
}
catch
(IOException e)
{
e.printStackTrace();
}
}
}
}
@Override
public
String execute()
throws
Exception
{
File[] srcFiles
=
this
.getUpload();
//
處理每個(gè)要上傳的文件
for
(
int
i
=
0
; i
<
srcFiles.length; i
++
)
{
//
根據(jù)服務(wù)器的文件保存地址和原文件名創(chuàng)建目錄文件全路徑
String dstPath
=
ServletActionContext.getServletContext()
.getRealPath(
this
.getSavePath())
+
"
\\
"
+
this
.getUploadFileName()[i];
File dstFile
=
new
File(dstPath);
this
.copy(srcFiles[i], dstFile);
}
returnSUCCESS;
}
}
運(yùn)行結(jié)果:
5
. Struts2的文件下載:
文件下載相對(duì)簡(jiǎn)單一些,一般只需在頁(yè)面上提供一個(gè)超鏈接,該鏈接的href屬性等于要下載文件的文件名就行了。但當(dāng)文件名有中文時(shí),就會(huì)導(dǎo)致失敗;或者要在用戶下載前進(jìn)行權(quán)限判斷,這時(shí)用Struts2提供的文件下載功能就能簡(jiǎn)單的解決這些問(wèn)題。
posted on 2012-08-01 17:41
奮斗成就男人
閱讀(583)
評(píng)論(0)
編輯
收藏
新用戶注冊(cè)
刷新評(píng)論列表
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問(wèn)
管理
Powered by:
BlogJava
Copyright © 奮斗成就男人
主站蜘蛛池模板:
洞头县
|
东乌珠穆沁旗
|
静海县
|
剑川县
|
中西区
|
岑溪市
|
广东省
|
沙湾县
|
普兰县
|
寿阳县
|
罗山县
|
罗江县
|
潼南县
|
天门市
|
合川市
|
攀枝花市
|
乃东县
|
广安市
|
龙游县
|
佛学
|
银川市
|
耒阳市
|
新乡市
|
额尔古纳市
|
阜城县
|
晴隆县
|
太湖县
|
敦煌市
|
东宁县
|
富平县
|
方正县
|
石柱
|
安徽省
|
淅川县
|
哈巴河县
|
宣城市
|
禹城市
|
文昌市
|
崇文区
|
秦皇岛市
|
松江区
|