struts2中图片的上传

来源:互联网 发布:lol有没有mac 编辑:程序博客网 时间:2024/05/17 03:39

实现原理

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!

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

 

 

原创粉丝点击