struts2之多个文件上传

struts2之多个文件上传

通过3种方式模拟多个文件上传,效果如下所示

2011032120584292.png

         

目录结构

 2011032120592080.png

新建Action

第一种方式


package
com.ljq.action;


import
java.io.File;


import
org.apache.commons.io.FileUtils;

import
org.apache.struts2.ServletActionContext;


import
com.opensymphony.xwork2.ActionContext;

import
com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings(

serial

)

public

class
UploadAction
extends
ActionSupport{


private
File[] image;
//
上传的文件



private
String[] imageFileName;
//
文件名称



private
String[] imageContentType;
//
文件类型




public
String execute()
throws
Exception {

ServletActionContext.getRequest().setCharacterEncoding(


UTF-8

);
String realpath

=
ServletActionContext.getServletContext().getRealPath(

/images

);
System.out.println(realpath);

if
(image
!=

null
) {

File savedir

=
new
File(realpath);

if
(
!
savedir.getParentFile().exists())
savedir.getParentFile().mkdirs();

for
(
int
i
=
0
;i
<
image.length;i
++
){

File savefile

=

new
File(savedir, imageFileName[i]);
FileUtils.copyFile(image[i], savefile);
}
ActionContext.getContext().put(


message

,

文件上传成功

);
}

return


success

;
}


public
File[] getImage() {


return
image;
}


public

void
setImage(File[] image) {


this
.image
=
image;
}


public
String[] getImageContentType() {


return
imageContentType;
}


public

void
setImageContentType(String[] imageContentType) {


this
.imageContentType
=
imageContentType;
}


public
String[] getImageFileName() {


return
imageFileName;
}


public

void
setImageFileName(String[] imageFileName) {


this
.imageFileName
=
imageFileName;
}

}

                   

第二种方式


package
com.ljq.action;


import
java.io.File;

import
java.io.FileInputStream;

import
java.io.FileOutputStream;


import
org.apache.struts2.ServletActionContext;


import
com.opensymphony.xwork2.ActionSupport;

/**

* 使用数组上传多个文件
*
*

@author
ljq
*

*/

@SuppressWarnings(


serial

)

public

class
UploadAction2
extends
ActionSupport{


private
File[] image;
//
上传的文件



private
String[] imageFileName;
//
文件名称



private
String[] imageContentType;
//
文件类型



private
String savePath;

@Override

public
String execute()
throws
Exception {

ServletActionContext.getRequest().setCharacterEncoding(


UTF-8

);

//
取得需要上传的文件数组


File[] files
=
getImage();

if
(files
!=
null

&&
files.length
>

0
) {


for
(
int
i
=

0
; i
<
files.length; i
++
) {


//
建立上传文件的输出流, getImageFileName()[i]


System.out.println(getSavePath()
+


\\


+
getImageFileName()[i]);
FileOutputStream fos

=

new
FileOutputStream(getSavePath()
+


\\


+
getImageFileName()[i]);

//
建立上传文件的输入流


FileInputStream fis
=

new
FileInputStream(files[i]);

byte
[] buffer
=

new

byte
[
1024
];

int
len
=

0
;

while
((len
=
fis.read(buffer))
>
0
) {

fos.write(buffer,

0
, len);
}
fos.close();
fis.close();
}
}

return
SUCCESS;
}


public
File[] getImage() {


return
image;
}


public

void
setImage(File[] image) {


this
.image
=
image;
}


public
String[] getImageFileName() {


return
imageFileName;
}


public

void
setImageFileName(String[] imageFileName) {


this
.imageFileName
=
imageFileName;
}


public
String[] getImageContentType() {


return
imageContentType;
}


public

void
setImageContentType(String[] imageContentType) {


this
.imageContentType
=
imageContentType;
}


/**

* 返回上传文件保存的位置
*
*

@return

*

@throws
Exception

*/


public
String getSavePath()
throws
Exception {


return
ServletActionContext.getServletContext().getRealPath(savePath);
}


public

void
setSavePath(String savePath) {


this
.savePath
=
savePath;
}

}

            

第三种方式


package
com.ljq.action;


import
java.io.File;

import
java.io.FileInputStream;

import
java.io.FileOutputStream;

import
java.util.List;


import
org.apache.struts2.ServletActionContext;


import
com.opensymphony.xwork2.ActionSupport;


/**

* 使用List上传多个文件
*
*

@author
ljq
*

*/

@SuppressWarnings(


serial

)

public

class
UploadAction3
extends
ActionSupport {


private
List
<
File
>
image;
//
上传的文件



private
List
<
String
>
imageFileName;
//
文件名称



private
List
<
String
>
imageContentType;
//
文件类型



private
String savePath;

@Override

public
String execute()
throws
Exception {

ServletActionContext.getRequest().setCharacterEncoding(


UTF-8

);

//
取得需要上传的文件数组


List
<
File
>
files
=
getImage();

if
(files
!=

null

&&
files.size()
>

0
) {


for
(
int
i
=

0
; i
<
files.size(); i
++
) {

FileOutputStream fos

=

new
FileOutputStream(getSavePath()
+


\\


+
getImageFileName().get(i));
FileInputStream fis

=

new
FileInputStream(files.get(i));

byte
[] buffer
=

new

byte
[
1024
];

int
len
=

0
;

while
((len
=
fis.read(buffer))
>

0
) {

fos.write(buffer,

0
, len);
}
fis.close();
fos.close();
}
}

return
SUCCESS;
}


public
List
<
File
>
getImage() {


return
image;
}


public

void
setImage(List
<
File
>
image) {


this
.image
=
image;
}


public
List
<
String
>
getImageFileName() {


return
imageFileName;
}


public

void
setImageFileName(List
<
String
>
imageFileName) {


this
.imageFileName
=
imageFileName;
}


public
List
<
String
>
getImageContentType() {


return
imageContentType;
}


public

void
setImageContentType(List
<
String
>
imageContentType) {


this
.imageContentType
=
imageContentType;
}


/**

* 返回上传文件保存的位置
*
*

@return

*

@throws
Exception

*/


public
String getSavePath()
throws
Exception {


return
ServletActionContext.getServletContext().getRealPath(savePath);
}


public

void
setSavePath(String savePath) {


this
.savePath
=
savePath;
}

}

              

struts.xml配置文件


<?
xml version
=

1.0

encoding
=

UTF-8


?>


<!
DOCTYPE struts PUBLIC


-//Apache Software Foundation//DTD Struts Configuration 2.0//EN




http://struts.apache.org/dtds/struts-2.0.dtd

>


<
struts
>


<!–
该属性指定需要Struts2处理的请求后缀,该属性的默认值是action,即所有匹配
*
.action的请求都由Struts2处理。
如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。

–>


<
constant name
=

struts.action.extension

value
=

do


/>


<!–
设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭
–>


<
constant name
=

struts.serve.static.browserCache

value
=

false


/>


<!–
当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开
–>


<
constant name
=

struts.configuration.xml.reload

value
=

true


/>


<!–
开发模式下使用,这样可以打印出更详细的错误信息
–>


<
constant name
=

struts.devMode

value
=

true


/>


<!–
默认的视图主题
–>


<
constant name
=

struts.ui.theme

value
=

simple


/>


<!–<
constant name
=

struts.objectFactory

value
=

spring


/>–>


<!–
解决乱码
–>


<
constant name
=

struts.i18n.encoding

value
=

UTF-8


/>


<
constant name
=

struts.multipart.maxSize

value
=

10701096

/>


<
package
name
=

upload

namespace
=

/upload


extends
=

struts-default

>


<
action name
=

*_upload


class
=

com.ljq.action.UploadAction

method
=

{1}

>


<
result name
=

success

>/
WEB

INF
/
page
/
message.jsp
</
result
>


</
action
>


</
package
>


<
package
name
=

upload1

namespace
=

/upload1


extends
=

struts-default

>


<
action name
=

upload1


class
=

com.ljq.action.UploadAction2

method
=

execute

>


<!–
要创建
/
image文件夹,否则会报找不到文件
–>


<
param name
=

savePath

>/
image
</
param
>


<
result name
=

success

>/
WEB

INF
/
page
/
message.jsp
</
result
>


</
action
>


</
package
>


<
package
name
=

upload2

namespace
=

/upload2


extends
=

struts-default

>


<
action name
=

upload2


class
=

com.ljq.action.UploadAction3

method
=

execute

>


<!–
要创建
/
image文件夹,否则会报找不到文件
–>


<
param name
=

savePath

>/
image
</
param
>


<
result name
=

success

>/
WEB

INF
/
page
/
message.jsp
</
result
>


</
action
>


</
package
>


</
struts
>

           

上传表单页面upload.jsp


<%
@ page language
=

java


import
=

java.util.*

pageEncoding
=

UTF-8

%>


<!
DOCTYPE HTML PUBLIC

-//W3C//DTD HTML 4.01 Transitional//EN

>


<
html
>


<
head
>


<
title
>
文件上传
</
title
>


<
meta http

equiv
=

pragma

content
=

no-cache

>


<
meta http

equiv
=

cache-control

content
=

no-cache

>


<
meta http

equiv
=

expires

content
=

0

>


</
head
>


<
body
>


<!–
${pageContext.request.contextPath}
/
upload
/
execute_upload.
do

–>


<!–
${pageContext.request.contextPath}
/
upload1
/
upload1.
do

–>


<!–
${pageContext.request.contextPath}
/
upload2
/
upload2.
do

–>


<!–

–>


<
form action
=

${pageContext.request.contextPath}/upload2/upload2.do

enctype
=

multipart/form-data

method
=

post

>

文件1:

<
input type
=

file

name
=

image

><
br
/>

文件2:

<
input type
=

file

name
=

image

><
br
/>

文件3:

<
input type
=

file

name
=

image

><
br
/>


<
input type
=

submit

value
=

上传


/>


</
form
>


</
body
>


</
html
>

显示页面message.jsp


<%
@ page language
=

java


import
=

java.util.*

pageEncoding
=

UTF-8

%>


<%
@ taglib uri
=

/struts-tags

prefix
=

s

%>


<!
DOCTYPE HTML PUBLIC

-//W3C//DTD HTML 4.01 Transitional//EN

>


<
html
>


<
head
>


<
title
>
My JSP

message.jsp

starting page
</
title
>


<
meta http

equiv
=

pragma

content
=

no-cache

>


<
meta http

equiv
=

cache-control

content
=

no-cache

>


<
meta http

equiv
=

expires

content
=

0

>


</
head
>


<
body
>

上传成功

<
br
/>


<
s:debug
></
s:debug
>


</
body
>


</
html
>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/110641.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 用stringstream读取数据「建议收藏」

    用stringstream读取数据「建议收藏」思想:全部读到一个字符串里,遇到”,”就换成空格,然后用这个字符串构造一个stringstream,用>>读到数组里。stringstream用法分为istream和ostringstream.1std::stringname(“zeta”);2intage=27;34ostringstreamos;5o

  • vscode支持java_vscode配置go环境

    vscode支持java_vscode配置go环境VScode配置Java环境1.下载JDK方式一:手动下载JDKOracleJavaSEAdoptOpenJdkAzulZuluforAzure-EnterpriseEdition方式二:VSCode中下载JDK下载JAVA插件扩展方式一:windows平台下可以直接访问这个地址直接下载带有java插件的vscode方式二:在vscode中下载以下插件LanguageSupportforJavabyRedHatDebug

  • 常用和不常用端口一览表收藏

    常用和不常用端口一览表收藏

  • 闭关六个月整理出来的微机原理知识点(特别适用河北专接本)

    闭关六个月整理出来的微机原理知识点(特别适用河北专接本)笔者准备过程中的总结,是通过填空题,简答题等等总结出来的如有不足,还望大佬们指教A14运算器和控制器又称为中央处理器(CPU)。计算机由运算器控制器存储器输入设备输出设备五大部分组成。根据传送的信息类型,系统总线可以分为三类:数据总线地址总线控制总线8086CPU由总线接口部件BIU执行部件EU组成。半导体存储器按存取方式不同,分为读写存储器RAM只读存储器ROM。读写存储器RAM指可以随机地、个别地对任意一个存储单元进行读写的存.

  • 监督学习、无监督学习、半监督学习、强化学习、自监督学习

    监督学习、无监督学习、半监督学习、强化学习、自监督学习一文读懂监督学习、无监督学习、半监督学习、强化学习四种方式 青烟王国 图:pixabay「机器人圈」导览:一般说来,训练深度学习网络的方式主要有四种:监督、无监督、半监督和强化学习。在接下来的文章中,机器人圈将逐个解释这些方法背后所蕴含的理论知识。除此之外,机器人圈将分享文献中经常碰到的术语,并提供与数学相关的更多资源。本文编译自硅谷著名的风险投资机构安德森霍洛维茨基金,作…

  • DM368开发 — 视频监控系统相关技术研究(转毕设)[通俗易懂]

    DM368开发 — 视频监控系统相关技术研究(转毕设)[通俗易懂]基于DM368的高清视频监控系统设计与实现–文波

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号