java之struts2之文件上传
1.在大多数应用中,都有文件上传功能。有两种文件上传的方式,一种是自己去解析http协议,获取文件上传的内容。另一种是通过第三方插件来实现文件上传。第三方插件一般有两种,smartfileupload(上传小文件效率比较好,没有更新),commons-fileupload。
2.在servlet中实现文件上传的步骤:
a) 导入jar包 commons-fileupload, common-io ;
b) 编写jsp 页面,表单提交必须是 post ,enctype="multipart/form-data"
<body>
<form action="fileupload" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="name"/><br>
文件:<input type="file" name="file"/><input type="submit" value="上传"/>
</form>
</body
c) 编写servlet
@WebServlet("/fileupload")
public class FileUploadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //上传文件存放位置
        String path = req.getServletContext().getRealPath("/upload");
        //创建磁盘目录工厂  该工厂可以设置 临时文件大小,还可以设置临时目录
        DiskFileItemFactory df = new DiskFileItemFactory();
        //将目录绑定ServletFileUpload 类  这个类完成http协议的解析
        ServletFileUpload upload=new ServletFileUpload(df);
        try {
            //解析req  返回所有表单项目目录
            List<FileItem> list = upload.parseRequest(req);
            for(FileItem item:list){
                if(item.isFormField()){//正常表单项
                    String name=item.getFieldName();
                    String value=item.getString();
                    System.out.println(name+"======"+value);
                }else{//文件上传项
                    String name=item.getName();
                    InputStream is = item.getInputStream();
                    OutputStream os = new FileOutputStream(new File(path,name));
                    byte[] buffer = new byte[400];
                    int len=0;
                    while((len=is.read(buffer))!=-1)
                        os.write(buffer, 0, len);
                    os.close();
                    is.close();
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }
}
3. Struts2中已经将文件上传功能封装好了,不需要再像servlet一样,分别来自己编码实现。
实现步骤:
a) 编写 jsp 页面和 servlet 编写方式一样
<form action="upload.action" method="post" enctype="multipart/form-data">
文件:<input type="file" name="file"/><input type="submit" value="上传"/>
</form>
b) 编写处理上传文件的 Action
public class UploadAction {
    //File的名称和表单域中的名称相同
    private File file;
    //获取文件名  文件名属性 必须是  表单域名+FileName;
    private String fileFileName;
    //获取文件的类型
    private String fileContentType;
    //上传的处理方法
    public String upload(){
        String path=ServletActionContext.getServletContext().getRealPath("/upload");
        try {
            FileUtils.copyFile(file, new File(path,fileFileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Action.SUCCESS;
    }
    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;
    }
}
4.批量的文件上传实现
Action 的实现
public class BatchUploadAction {
    //File的名称和表单域中的名称相同
    private File[] file;
    //获取文件名  文件名属性 必须是  表单域名+FileName;
    private String[] fileFileName;
    //获取文件的类型
    private String[] fileContentType;
    //上传的处理方法
    public String upload(){
        String path=ServletActionContext.getServletContext().getRealPath("/upload");
        try {
            for(int i=0;i<file.length;i++)
                FileUtils.copyFile(file[i], new File(path,fileFileName[i]));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Action.SUCCESS;
    }
    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;
    }
}
Jsp
<script type="text/javascript" src="jquery-1.11.3.min.js"></script>
<script type="text/javascript">
$(function(){
$('#btn').click(function(){
var html=$("#content").html();
html+="文件:<input type='file' name='file'/><br>";
$("#content").html(html);
}); });
</script>
</head>
<body>
<form action="batch.action" method="post" enctype="multipart/form-data">
文件:<input type="file" name="file"/><input type="button" value="增加" id="btn"/><br>
<div id="content"></div>
<input type="submit" value="上传"/>
</form>
</body>
Struts.xml
<struts>
<!-- 设置上传文件大小的常量
maximumSize是单个文件大小
maxSize 上传总文件大小
maximunSize=20M maxSize=200M,说明一次可以上传10个20M大小的文件
-->
<constant name="struts.multipart.maxSize" value="209715200"></constant>
<package name="default" extends="struts-default" namespace="/">
<action name="upload" class="cn.sxt.action.UploadAction" method="upload">
<result>/success.jsp</result>
</action>
<action name="batch" class="cn.sxt.action.BatchUploadAction" method="upload">
<result>/success.jsp</result>
<interceptor-ref name="fileUpload">
<!-- 设置上传的单个文件大小 -->
<param name="maximumSize">20971520</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
</struts>
java之struts2之文件上传的更多相关文章
- struts2的文件上传
		在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来 ... 
- jsp\struts1.2\struts2 中文件上传(转)
		jsp\struts1.2\struts2 中文件上传 a.在jsp中简单利用Commons-fileupload组件实现 b.在struts1.2中实现c.在sturts2中实现现在把Code与大家 ... 
- Struts2+Uploadify文件上传使用详解
		Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示.不过官方提供的实例是php版本的,本文将详细介绍Uploadify在java中的使用,您也可以点击下面的链接进行演示或下 ... 
- Struts2实现文件上传下载功能(批量上传)
		今天来发布一个使用Struts2上传下载的项目, struts2为文件上传下载提供了好的实现机制, 首先,可以先看一下我的项目截图 关于需要使用的jar包,需要用到commons-fileupload ... 
- Struts2实现文件上传(三)
		Struts2实现文件上传 配置文件web.xml <?xml version="1.0" encoding="UTF-8"?> <web-a ... 
- Struts2实现文件上传(二)
		Struts2实现文件上传 文件上传页面 file.jsp: <%@ page language="java" import="java.util.*" ... 
- Struts2实现文件上传(一)
		Struts2实现文件上传 文件上传成功后结果页面 result.jsp: <%@ page language="java" import="java.util.* ... 
- Struts2单文件上传原理及示例
		一.文件上传的原理 表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值: 1.application/x-www-form-urlencoded:这是默认编码方式,它只处理表单域里 ... 
- struts2多文件上传-2
		<!-- 多文件上传 --> <action name="UploadAction2_*" class="uploadfile.UploadAction ... 
随机推荐
- [HAOI 2018]染色
			传送门 Description 一个长度为\(N\)的序列, 每个位置都可以被染成 \(M\)种颜色中的某一种. 出现次数恰好为 \(S\)的颜色种数有\(i\)种, 会产生\(w_i\)的愉悦度. ... 
- 图解LinkedHashMap原理
			1 前言 LinkedHashMap继承于HashMap,如果对HashMap原理还不清楚的同学,请先看上一篇:图解HashMap原理 2 LinkedHashMap使用与实现 先来一张LinkedH ... 
- RocketMq重复消费问题排查
			前情 出现了重复消费的问题,同一个消息被重复消费了多次,导致了用户端收到了多条重复的消息,最终排查发现,是因为消费者在处理消息的方法onMessage中有异常没有捕获到,导致异常上抛,被consume ... 
- git的commit撤销
			写完代码后,我们一般这样 git add . //添加所有文件 git commit -m "本功能全部完成" 执行完commit后,想撤回commit,怎么办? 这样凉拌: gi ... 
- TOMCAT 可以稳定支持的最大并发用户数
			微软系统平台上 TOMCAT性能调优后可以稳定支持的最大并发用户数量在300人服务器配置: 单硬盘,SATA 8MB缓存测试服务器和loadrunner运行服务器位于同一网段 100MB网络( ... 
- python简单的游戏场景代码
			模拟英雄联盟游戏场景的简单场景 最后计算出英雄的战斗力 class Hero: def __init__(self, na, gen, age, fig): self.name = na self.g ... 
- Charles  激活入口以及账号密码
			激活入口 // Charles Proxy License // 适用于Charles任意版本的注册码,谁还会想要使用破解版呢. // Charles 4.2目前是最新版,可用. Registered ... 
- understand-show-slave-status-g
			https://dba.stackexchange.com/questions/22623/mysql-exec-master-log-pos-value-greater-than-read-mast ... 
- [译]如何取消本地的git commit提交?
			git reset HEAD~1 原文来源:https://stackoverflow.com/questions/4850717/how-to-cancel-a-local-git-commit 
- [python语法]python中如何判断一个集合是另一个集合的子集?
			问:python中如何判断一个集合是另一个集合的子集? 答:用issubset()方法 语法: A.issubset(B) 返回: True 如果A是B的子集. False 如果A不是B的子集. 样例 ... 
