struts2.0怎么实现上传文件

struts2.0怎么实现上传文件,第1张

一、创建jsp页面:

注意!要上传文件,表单必须添加 enctype 属性,如下: enctype="multipart/form-data"

index.jsp 代码如下:

<%@ page language="java" contentType="text/htmlcharset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/htmlcharset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<!-- 注意!表单必须添加 enctype 属性,值为"multipart/form-data" -->

<form action="upload.action" method="post" enctype="multipart/form-data">

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

<input type="submit" value="上传"/>

</form>

</body>

</html>

二、创建Action类:

1. 添加三个私有字段,并添加相应的get,set方法。

private File file——上传的文件,变量名对应页面上"file"input的name属性值。类型为java.io.File

private String fileContentType——上传文件的格式类型名,变量名格式为:页面上"败盯file"input的name属性闷枯世值+ContentType

private String fileFileName——上传的文件名,变量名格式为:页面上"file"input的name属性值+fileFileName。

2. 使用struts2提供的FileUtils类拷贝进行文件的拷贝。FileUtils类位于org.apache.commons.io包下。

3. 在项目目录下的WebContent目录下添加 upload 文件夹,用于存放客户端上传过来的文件,对应第15行代码。

Upload.java代码如下:

1 import java.io.File

2 import java.io.IOException

3 import org.apache.commons.io.FileUtils

4 import org.apache.struts2.ServletActionContext

5 import com.opensymphony.xwork2.ActionSupport

6

7 public class Upload extends ActionSupport{

8 private File file

9 private String fileContentType

10 private String fileFileName

11

12 @Override

13 public String execute() throws Exception {

14 //得到上传文件在服务器的路径加文件名

15 String target=ServletActionContext.getServletContext().getRealPath("/upload/"+fileFileName)

16 /蚂肢/获得上传的文件

17 File targetFile=new File(target)

18 //通过struts2提供的FileUtils类拷贝

19 try {

20 FileUtils.copyFile(file, targetFile)

21 } catch (IOException e) {

22 e.printStackTrace()

23 }

24 return SUCCESS

25 }

26

27 //省略get,set方法...........

28

29 }

三、在struts.xml中添加相应的配置代码。

struts.xml代码如下:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"

"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

<package name="default" namespace="/" extends="struts-default">

<action name="upload" class="Upload">

<result>index.jsp</result>

</action>

</package>

</struts>

四、测试。

启动服务器,进入index页面。

选择一改图片,点击上传提交表单。

打开upload文件夹(注意,这里指的是web服务器下的目录,如我用的web服务器是tomcat安装在电脑D盘,项目名称为“Struts2Upload”那么其路径为:D:\apache-tomcat-7.0.40\webapps\Struts2Upload\upload)可以看到刚才选中的图片已经上传到该目录下了。

上传多个文件

一、修改页面文件

增加继续添加按钮和 addfile() 方法,让页面可以通过javascript增加 input 标签。

修改后的 index.jsp代码如下:

1 <%@ page language="java" contentType="text/htmlcharset=UTF-8"

2 pageEncoding="UTF-8"%>

3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

4 <html>

5 <head>

6 <meta http-equiv="Content-Type" content="text/htmlcharset=UTF-8">

7 <script type="text/javascript">

8 //添加javascript方法 addfile() 在页面中境加input标签、

9 function addfile(){

10 var file = document.createElement("input")

11 file.type="file"

12 file.name="file"

13 document.getElementById("fileList").appendChild(file)

14 document.getElementById("fileList").appendChild(document.createElement("br"))

15 }

16 </script>

17 <title>Insert title here</title>

18 </head>

19 <body>

20 <!-- 注意!表单必须添加 enctype 属性,值为"multipart/form-data" -->

21 <form action="upload.action" method="post" enctype="multipart/form-data">

22 <div id="fileList">

23 <input type="file" name="file" /><br/>

24 </div>

25 <!-- 添加继续添加按钮,点击按钮调用addfile() -->

26 <input type="button" value="继续添加" onclick="addfile()" />

27 <input type="submit" value="上传"/>

28 </form>

29 </body>

30 </html>

二、修改Action类

1. 把三个私有字段(file,fileContentType,fileFileName)的类型更改为数组或集合类型。并添加相应的get,set方法。

2. 通过循环来上传多个文件。

修改后的Upload.java代码如下:

import java.io.File

import java.io.IOException

import org.apache.commons.io.FileUtils

import org.apache.struts2.ServletActionContext

import com.opensymphony.xwork2.ActionSupport

public class Upload extends ActionSupport{

//把这三个字段类型更改为数组或集合

private File[] file

private String[] fileContentType

private String[] fileFileName

@Override

public String execute() throws Exception {

//通过循环来上传多个文件

for(int i=0i<file.lengthi++){

//得到上传文件在服务器的路径加文件名

String target=ServletActionContext.getServletContext().getRealPath("/upload/"+fileFileName[i])

//获得上传的文件

File targetFile=new File(target)

//通过struts2提供的FileUtils类拷贝

try {

FileUtils.copyFile(file[i], targetFile)

} catch (IOException e) {

e.printStackTrace()

}

}

return SUCCESS

}

//省略set,get方法...................

}

三、测试

1. 启动服务器,打开index.jsp页面。点击继续添加,添加两个input。同时上传三张图片。

2. 点击上传提交表单。打开upload文件夹,可以看到刚才选中的三张图片已经上传到该目录下了。

参考资料http://www.cnblogs.com/likailan/p/3330465.html

可以用随机函数,得到一个随机数,再加上当前的时间,作亮哪为一个符号串敬厅码当文件的文件名,然后把上传的文件取得原来的文件名,截取原来文件名的伏尺后缀名,记得连点一起截取,这样就可以把刚才的随机数加时间再加截取得的后缀名作为新的文件名;代码如下:其在action是这样:package huan.lin.shopactionimport java.io.File

import java.io.FileInputStream

import java.io.FileOutputStream

import java.io.InputStream

import java.io.OutputStream

import java.util.Date

import java.util.Randomimport org.apache.struts2.ServletActionContextimport huan.lin.shopbean.Shop

import huan.lin.shopservice.Shopserviceimport com.opensymphony.xwork2.ActionSupportpublic class Saveshopaction extends ActionSupport {

private static final long serialVersionUID = -7387264205534303757Lprivate Shopservice shopserviceprivate String spname

private String sppaizi

private String spms

private String sppicurl

private String sphave

private double spprice

private File file

private String fileFileName

private String fileContentType@SuppressWarnings("deprecation")

public String execute() throws Exception {

//文件上传

long time = new Date().getTime()

Random ran = new Random()

int newran = ran.nextInt(10000)

InputStream is = new FileInputStream(file)

String sub = this.getFileFileName()

String subname = sub.substring(sub.lastIndexOf(".", sub.length()))

String filename = time + "" + newran + subname

String root = ServletActionContext.getRequest().getRealPath("/uploadsmallimage")

File destFile = new File(root, filename)

OutputStream os = new FileOutputStream(destFile)

byte[] buffer = new byte[4000]

int length = 0

while ((length = is.read(buffer)) >0) {

os.write(buffer, 0, length)

}

is.close()

os.close()

//数据保存 Shop shop = new Shop()

shop.setSpname(spname)

shop.setSppaizi(sppaizi)

shop.setSpprice(spprice)

shop.setSphave(sphave)

shop.setSpms(spms)

shop.setSppicurl(filename) this.getShopservice().save(shop)

return SUCCESS

}

public Shopservice getShopservice() {

return shopservice

} public void setShopservice(Shopservice shopservice) {

this.shopservice = shopservice

} public String getSpname() {

return spname

} public void setSpname(String spname) {

this.spname = spname

} public String getSpms() {

return spms

} public void setSpms(String spms) {

this.spms = spms

} public String getSppicurl() {

return sppicurl

} public void setSppicurl(String sppicurl) {

this.sppicurl = sppicurl

} public String getSphave() {

return sphave

} public void setSphave(String sphave) {

this.sphave = sphave

}

public File getFile() {

return file

} public void setFile(File file) {

this.file = file

} public String getFileFileName() {

return fileFileName

} public void setFileFileName(String fileFileName) {

this.fileFileName = fileFileName

} public String getFileContentType() {

return fileContentType

} public void setFileContentType(String fileContentType) {

this.fileContentType = fileContentType

} public double getSpprice() {

return spprice

} public void setSpprice(double spprice) {

this.spprice = spprice

}

public void validate()

{

}

public String getSppaizi() {

return sppaizi

}

public void setSppaizi(String sppaizi) {

this.sppaizi = sppaizi

}

}

在servlet中如下: package huan.linimport java.io.IOException

import java.sql.SQLExceptionimport java.util.Date

import java.util.Random

import javax.naming.InitialContext

import javax.naming.NamingException

import javax.servlet.ServletContext

import javax.servlet.ServletException

import javax.servlet.http.HttpServlet

import javax.servlet.http.HttpServletRequest

import javax.servlet.http.HttpServletResponse

import javax.servlet.http.HttpSession

import javax.sql.DataSourceimport org.apache.commons.dbutils.QueryRunnerimport com.jspsmart.upload.File

import com.jspsmart.upload.Files

import com.jspsmart.upload.SmartUploadpublic class PhotouploadServlet extends HttpServlet { private static final long serialVersionUID = -806574948649837705Lpublic void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doPost(request, response)} public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

HttpSession session = request.getSession()

Users users = (Users) session.getAttribute("users")

if (users == null) {

response.sendRedirect("/lin01/admin/login.jsp")

} else {

request.setCharacterEncoding("utf-8")

String newname = ""

// 新建一个SmartUpload对象

SmartUpload su = new SmartUpload()

// 上传初始化 su.initialize(this.getServletConfig(), request, response)

// 限制每个上传文件的最大长度。 su.setMaxFileSize(600000)

// 限制总上传数据的长度。

// su.setTotalMaxFileSize(200000)

// 设定允许上传的文件(通过扩展名限制),仅允许doc,txt文件。

su.setAllowedFilesList("jpeg,gif,jpg,bmp") try { su.upload() Files fes = su.getFiles()

File fe = fes.getFile(0)

String name = fe.getFileName()

String subname = name.substring(name.lastIndexOf("."), name

.length())

long time1 = new Date().getTime()

Random ran = new Random()

int newran = ran.nextInt(10000)

newname = time1 + "" + newran + subname

ServletContext sc = this.getServletContext()

String path = sc.getRealPath("upload")

fe.saveAs(path+"/"+newname) InitialContext ctx = null

try {

ctx = new InitialContext()

} catch (NamingException e) {

// TODO Auto-generated catch block

e.printStackTrace()

}

DataSource ds = null

try {

ds = (DataSource)ctx.lookup("java:comp/env/jdbc/rollerdb")

} catch (NamingException e) {

// TODO Auto-generated catch block

e.printStackTrace()

}

int result = 0 try {String sql = "insert into photo (name) values (?)" String params[] = { newname }

// DButils中核心类,生成对象时传递数据源对象

QueryRunner qr = new QueryRunner(ds) result = qr.update(sql, params)

} catch (SQLException e) {

e.printStackTrace()

}

String message = ""

if (result == 1) {

message = "Congratulation to you(恭喜你),上传成功!"

} else {

message = "Sorry,上传失败!"

} request.setAttribute("message", message) request.getRequestDispatcher("/photouploadsuccess.jsp").forward(request,

response) } catch (Exception e) {

response.sendRedirect("/lin01/uploadphotoerror.jsp")

} }

}}

通过3种方式模拟多笑和纯个文件上传

第一种方式

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=0i<碰咐image.lengthi++){

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 = 0i <files.lengthi++) {

//建立上传文件的输出流, 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 = 0i <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>


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12299260.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存