本文将以图片上传为例,解析Struts2文件上传的主要过程
实例的功能:1、在jsp页面选择要上传的图片,
                 2、为待上传的图片取名,以便于查找


                 3、点击提交后,直接进入图片展示页面,
                 4、选择要展示的图片名后,图片显示


代码及主要解释:
jsp页面代码:
图片上传页面uploadForm.jsp:
<body>
<s:form action="addPicPro" enctype="multipart/form-data">
  <s:textfield name="picName" label="图片名"/>
  <s:file name="pic" label="选择上传图片"/>
  <s:submit value="提交"/>
</s:form>
</body>
图片展示页面listPics:
<body>
<s:select
        list="pics" listKey="fileName" listValue="picName" label="选择图片"
        onchange="document.getElementById('show').src='upload/'+ this.value;"/><br/> <!--至少添加两副图片,才可以触发该js代码 -->
<img id="show"/>
</body>

***********************************************************************************************************

AddPicProAction:
public class AddPicProAction implements Action{
    private String picName;  //输入的文件名

//文件上传域需要用三个File进行封装
    private File pic;             //上传文件本身
    private String picFileName;  //上传文件的原始文件名
    private String picContentType;//上传文件的文件类型

public String getPicName() {
        return picName;
    }

public void setPicName(String picName) {
        this.picName = picName;
    }

public File getPic() {
        return pic;
    }

public void setPic(File pic) {
        this.pic = pic;
    }

public String getPicFileName() {
        return picFileName;
    }

public void setPicFileName(String picFileName) {
        this.picFileName = picFileName;
    }

public String getPicContentType() {
        return picContentType;
    }

public void setPicContentType(String picContentType) {
        this.picContentType = picContentType;
    }

@Override
    public String execute() throws Exception {
        //获取/upload文件夹的绝对路径
        String uploadPath = ServletActionContext.getServletContext().getRealPath("/upload");
 //文件新名字,以一个随机数区分开
        String newFileName = UUID.randomUUID().toString() + picFileName.substring(picFileName.lastIndexOf("."));

//新建一个文件输入流,待上传的文件
        FileInputStream fileInputStream = new FileInputStream(pic);
        //新建一个文件输出流, 上传的物理目录
        FileOutputStream fileOutputStream = new FileOutputStream(uploadPath+"\\"+newFileName);

byte[] buff = new byte[1024];
        int hasRead = 0;
        System.out.print(newFileName);
        while ((hasRead = fileInputStream.read(buff)) > 0){
            fileOutputStream.write(buff,0,hasRead);
        }
        System.out.print(newFileName);

fileInputStream.close();
        fileOutputStream.close();

//=========上面文件上传已经成功============

PicService picService = new PicService();
        picService.addPic(picName,newFileName);
        return SUCCESS;
    }
}

这里简要介绍一下介绍将upload文件夹新建在何位置:如果用的eclipse,直接新建在WebContent根目录下;而我自己用的是IntelliJ IDEA,在测试很久之后才发现要新建在out/artifacts/***_war_exploded/下,(测试方法:打印输出ServletActionContext.getServletContext().getRealPath("/upload"),可知道文件夹应新建在什么位置);

图例如下:

Struts2对于文件上传,需要在Action中提供三个File进行封装
1、与文件上传域的name相同,类型为File的File
2、取名为文件上传域的name+FileName ,类型为String的File
3、取名为文件上传域的name+ContentType,类型为String的File

ListPicsAction:
public class ListPicsAction implements Action{
    private List<Pic> pics ;

public List<Pic> getPics() {
        return pics;
    }

public void setPics(List<Pic> pics) {
        this.pics = pics;
    }

@Override
    public String execute() throws Exception {
        PicService picService = new PicService();
        setPics(picService.getAllPics());
        return SUCCESS;
    }
}

******************************************************

图片类Pic:
public class Pic {
    private Integer id;
    private String picName;
    private String fileName;  //磁盘保存的文件名

public Pic() {
    }

public Pic(Integer id, String picName, String fileName) {
        this.id = id;
        this.picName = picName;
        this.fileName = fileName;
    }

public Integer getId() {
        return id;
    }

public void setId(Integer id) {
        this.id = id;
    }

public String getFileName() {
        return fileName;
    }

public void setFileName(String fileName) {
        this.fileName = fileName;
    }

public String getPicName() {
        return picName;
    }

public void setPicName(String picName) {
        this.picName = picName;
    }
}

PicService类:
public class PicService {
    static List<Pic> picDB = new ArrayList<Pic>();
    public void addPic(String picName,String fileName){
        picDB.add(new Pic(new Random().nextInt(9999),picName,fileName));
    }

public List<Pic> getAllPics() {
        return picDB;
    }
}

******************************************************************************

Struts.xml的配置
<action name="addPicPro" class="action.AddPicProAction">
     <result name="success" type="chain">listPics</result>
</action>
<action name="listPics" class="action.ListPicsAction">
      <result>/WEB-INF/content/listPics.jsp</result>
</action>

Struts2文件上传功能浅析的更多相关文章

  1. Struts2文件上传(基于表单的文件上传)

    •Commons-FileUpload组件 –Commons是Apache开放源代码组织的一个Java子项目,其中的FileUpload是用来处理HTTP文件上传的子项目   •Commons-Fil ...

  2. 学习Struts--Chap07:Struts2文件上传和下载

    1.struts2文件上传 1.1.struts2文件上传的基本概述 在开发web应用的时候,我们一般会为用户提供文件上传的功能,比如用户上传一张图像作为头像等.为了能上传文件,我们必须将表单的met ...

  3. 【Java EE 学习 35 下】【struts2】【struts2文件上传】【struts2自定义拦截器】【struts2手动验证】

    一.struts2文件上传 1.上传文件的时候要求必须使得表单的enctype属性设置为multipart/form-data,把它的method属性设置为post 2.上传单个文件的时候需要在Act ...

  4. springMvc 使用ajax上传文件,返回获取的文件数据 附Struts2文件上传

    总结一下 springMvc使用ajax文件上传 首先说明一下,以下代码所解决的问题 :前端通过input file 标签获取文件,通过ajax与后端交互,后端获取文件,读取excel文件内容,返回e ...

  5. Struts2文件上传下载

    Struts2文件上传 Struts2提供 FileUpload拦截器,用于解析 multipart/form-data 编码格式请求,解析上传文件的内容,fileUpload拦截器 默认在defau ...

  6. Struts2文件上传和下载(原理)

    转自:http://zhou568xiao.iteye.com/blog/220732 1.    文件上传的原理:表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:1)     ...

  7. iOS 的 Safari 文件上传功能详解

    iOS 6 给 Safari 浏览器带来的另外一个功能是文件上传,终于 Safari 终于支持 input 输入框的文件类型了,并且还支持 HTML媒体捕获(HTML Media Capture). ...

  8. struts2文件上传大小限制问题小结

    一:首先看一下程序执行中出现的对应报错信息,如下所示: [WARN ] 2015-03-03 15:31:11 :Unable to parse request org.apache.commons. ...

  9. Struts2 文件上传

    一:表单准备 ① 要想使用HTML 表单上传一个或多个文件     –须把 HTML表单的 enctype属性设置为multipart/form-data     –须把HTML 表单的method ...

随机推荐

  1. [C语言(VC)] 打造自己的键盘记录器 (zaroty)

    说起键盘记录,想必很多朋友都用过网上流传的一些键盘记录软件吧,但是有没有想过自己写一个呢?也许你会想:会不会很复杂啊?我可以很负责的告诉你,写键盘记录是很简单的.你所需要的仅仅是懂得一些C语言的DLL ...

  2. 怎样通过iPhone Safari 来安装测试版ipa

    http://www.cocoachina.com/bbs/read.php?tid=94101# <?xml version="1.0" encoding="UT ...

  3. 导出cluster log

    将所有群集节点的日志导出到 clog 目录下: get-clusterlog -destination c:\clog 只导出前10分钟的群集日志: get-cluster -destination ...

  4. hdu 5495 LCS 水题

    LCS Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5495 Descr ...

  5. [GIF] Parenting in GIF Loop Coder

    In this lesson, we look at how you can build up complex animations by assigning one shape as the par ...

  6. iOS开发——高级技术&广告功能的实现

    广告功能的实现 iPhone/iPad的程序,即使是Free的版本,也可以通过广告给我们带来收入.前提是你的程序足够吸引人,有足够的下载量.这里,我将介绍一下程序中集成广告的方法.主要有两种广告iAd ...

  7. js 三元运算符以及|| 和 && 测试

    var  a = '0';var  b = a ? 'me':'hi'; console.log(b);//false 有: undefined , 0, '', false,null//true  ...

  8. java_jdbc_反射

    package cn.itcast.Reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; imp ...

  9. CCCatmullRomTo&CCCatmullRomBy

    注: 云形线(Catmull-Rom curve曲线) 云线(Spline或B-spline)在数学上有很多种类,常用的三阶云线有Hermite, Bezier, Uniform B-spline, ...

  10. Migration from Zend Framework v2 to v3

    Migration from Zend Framework v2 to v3 Zend Framework v2 to v3 has been intended as an incremental u ...