您的位置:首页 > 编程语言 > Java开发

struts2中图片的上传

2009-09-14 09:16 495 查看

实现原理

Struts 2是通过Commons FileUpload文件上传。Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。

需要的包



jsp页面

FileUpload.jsp:

<% @ page language = " java " contentType = " text/html; charset=utf-8 " pageEncoding = " utf-8 " %>
<% @ taglib prefix = " s " uri = " /struts-tags " %>

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head >
< title > Struts 2 File Upload </ title >
</ head >
< body >
< form action ="fileUpload" method ="POST" enctype ="multipart/form-data" >
< file name ="file" ContentEditable="false"/>
</ form >
</ body >
</ html >

备注:form中enctype ="multipart/form-data"是必须的,莫漏, ContentEditable="false"是用来禁止用户在浏览地址框里进行手动输入的。

Action

package tutorial;




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 java.util.Date;




import org.apache.struts2.ServletActionContext;




import com.opensymphony.xwork2.ActionSupport;






public class FileUploadAction extends ActionSupport {


private static final long serialVersionUID = 572146812454l ;


private static final int BUFFER_SIZE = 16 * 1024 ;




private File myFile;


private String contentType;


private String fileName;


private String imageFileName;


private String caption;






public void setMyFileContentType(String contentType){


this .contentType = contentType;


}






public void setMyFileFileName(String fileName)

{


this .fileName = fileName;


}






public void setMyFile(File myFile)

{


this .myFile = myFile;


}






public String getImageFileName()

{


return imageFileName;


}






public String getCaption()

{


return caption;


}






public void setCaption(String caption)

{


this .caption = caption;


}






private static void copy(File src, File dst)

{




try

{


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 = new byte [BUFFER_SIZE];




while (in.read(buffer) > 0 )

{


out.write(buffer);


}




} finally

{




if ( null != in)

{


in.close();


}




if ( null != out)

{


out.close();


}


}




} catch (Exception e)

{


e.printStackTrace();


}


}






private static String getExtention(String fileName)

{


int pos = fileName.lastIndexOf( " . " );


return fileName.substring(pos);


}




@Override




public String execute()

{


imageFileName = new Date().getTime() + getExtention(fileName);


File imageFile = new File(ServletActionContext.getServletContext().getRealPath( " /UploadImages " ) + " / " + imageFileName);


copy(myFile, imageFile);


return SUCCESS;


}




}

备注:

myFile,还有myFileContentType(上传文件的MIME类型)和myFileFileName和jsp页面中的file标签对应

显示页面

<% @ page language = " java " contentType = " text/html; charset=utf-8 " pageEncoding = " utf-8 " %>
<% @ taglib prefix = " s " uri = " /struts-tags " %>

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head >
< title > Struts 2 File Upload </ title >
</ head >
< body >
< div style ="padding: 3px; border: solid 1px #cccccc; text-align: center" >
< img src ='UploadImages/<s:property value ="imageFileName" /> ' />
< br />
< s:property value ="caption" />
</ div >
</ body >
</ html >

Action的配置文件

<? 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 >
< package name ="fileUploadDemo" extends ="struts-default" >
< action name ="fileUpload" class ="tutorial.FileUploadAction" >
< interceptor-ref name ="fileUploadStack" />
< result name ="success" > /ShowUpload.jsp </ result >
</ action >
</ package >
</ struts >

web.xml配置文件

<? xml version="1.0" encoding="UTF-8" ?>
< web-app id ="WebApp_9" version ="2.4"
xmlns ="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation ="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >

< display-name > Struts 2 Fileupload </ display-name >

< filter >
< filter-name > struts-cleanup </ filter-name >
< filter-class >
org.apache.struts2.dispatcher.ActionContextCleanUp
</ filter-class >
</ filter >

< filter >
< filter-name > struts2 </ filter-name >
< filter-class >
org.apache.struts2.dispatcher.FilterDispatcher
</ filter-class >
</ filter >

< filter-mapping >
< filter-name > struts-cleanup </ filter-name >
< url-pattern > /* </ url-pattern >
</ filter-mapping >

< filter-mapping >
< filter-name > struts2 </ filter-name >
< url-pattern > /* </ url-pattern >
</ filter-mapping >

< welcome-file-list >
< welcome-file > index.html </ welcome-file >
</ welcome-file-list >

</ web-app >

阻止用户上传非图片类型的文件

方法一:

修改FileUpload.jsp,在<body>与<s:form>之间加入“<s:fielderror />”,用于在页面上输出错误信息。

然后修改struts.xml文件,将Action fileUpload改为如下所示:

< action name ="fileUpload" class ="tutorial.FileUploadAction" >
< interceptor-ref name ="fileUpload" >
< param name ="allowedTypes" >
image/bmp,image/png,image/gif,image/jpeg
</ param >
</ interceptor-ref >
< interceptor-ref name ="defaultStack" />
< result name ="input" > /FileUpload.jsp </ result >
< result name ="success" > /ShowUpload.jsp </ result >
</ action >

方法二:

BufferedImage imgBuffer = ImageIO.read(file);
if(null == imgBuffer) {
// 非图片,进行处理

}

阻止用户上传图片过大

方法一:配置fileupload拦截器的maximumSize参数(设定能接受的文件的最大长度)

< param name ="fileUpload.maximumSize" >
102400

</ param >

方法二:在struts.xml文件中添加

<constant name = "sruts.multipart.maxsize" value ="102400"/>(限制上传文件的最大长度)

关于将图片上传到项目

用ServletActionContext.getServletContext().getRealPath(str);来获取项目地址,其中str是项目下的相对路径

在eclipse 下上传图片到项目,即使上传成功也看不到,因为它被存储在一个临时目录下,你可以在你的项目文件下搜一下

只有打成var包发布后才能在项目中实际存储

未解决问题

一、不能实现在jsp中控制上传文件的大小

二、若JPEG图片的ICC信息被破坏了ImageIO会抛出异常bandOffsets.length is wrong!

欢迎大家提出问题,更欢迎大家解决上面两个问题

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: