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之文件上传的更多相关文章

  1. struts2的文件上传

    在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来 ...

  2. jsp\struts1.2\struts2 中文件上传(转)

    jsp\struts1.2\struts2 中文件上传 a.在jsp中简单利用Commons-fileupload组件实现 b.在struts1.2中实现c.在sturts2中实现现在把Code与大家 ...

  3. Struts2+Uploadify文件上传使用详解

    Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示.不过官方提供的实例是php版本的,本文将详细介绍Uploadify在java中的使用,您也可以点击下面的链接进行演示或下 ...

  4. Struts2实现文件上传下载功能(批量上传)

    今天来发布一个使用Struts2上传下载的项目, struts2为文件上传下载提供了好的实现机制, 首先,可以先看一下我的项目截图 关于需要使用的jar包,需要用到commons-fileupload ...

  5. Struts2实现文件上传(三)

    Struts2实现文件上传 配置文件web.xml <?xml version="1.0" encoding="UTF-8"?> <web-a ...

  6. Struts2实现文件上传(二)

    Struts2实现文件上传 文件上传页面 file.jsp: <%@ page language="java" import="java.util.*" ...

  7. Struts2实现文件上传(一)

    Struts2实现文件上传 文件上传成功后结果页面 result.jsp: <%@ page language="java" import="java.util.* ...

  8. Struts2单文件上传原理及示例

    一.文件上传的原理 表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值: 1.application/x-www-form-urlencoded:这是默认编码方式,它只处理表单域里 ...

  9. struts2多文件上传-2

    <!-- 多文件上传 --> <action name="UploadAction2_*" class="uploadfile.UploadAction ...

随机推荐

  1. 设置win 10 软件开机启动

    C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 将快捷方式粘贴进去即可

  2. avalon用background-image不起作用,怎么来选取前几个的图片进行渲染

    <span ms-css="{backgroundImage: 'url('+item.image + ')'}" ms-for="($index,item) in ...

  3. 刷题记录:[0CTF 2016]piapiapia

    目录 刷题记录:[0CTF 2016]piapiapia 一.涉及知识点 1.数组绕过正则及相关 2.改变序列化字符串长度导致反序列化漏洞 二.解题方法 刷题记录:[0CTF 2016]piapiap ...

  4. 第06组 Alpha冲刺(4/4)

    队名:福大帮 组长博客链接:https://www.cnblogs.com/mhq-mhq/p/11913386.html 作业博客 :https://edu.cnblogs.com/campus/f ...

  5. _nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' failed

    在Ubuntu18上使用交叉编译工具,报这个错.研究之下发现,工具的绝对路径过长,ubuntu18对其优化,修改路径,导致报错. 使用命令:export LC_ALL=C

  6. Arcgis案例操作教程——去掉Z值和M值

    Arcgis案例操作教程--去掉Z值和M值 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com 处理前 处理后: 处理方法     商务合作,科技咨 ...

  7. Java基础 while 简单示例

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  8. 爬虫中Requests模块

    Requests: 让 HTTP 服务人类 虽然Python的标准库中 urllib2 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 “ ...

  9. jdk1.7 64位官方下载

    平时要新装一个系统环境,或者下载最新的jdk,就需要到oracle官网去下载一个jdk,而目前生产环境都是1.7的环境下开发完成的,需要下载1.7版本的jdk,oracle官方网站的默认下载页面是1. ...

  10. Oracle 性能分析

    1.--查出耗时长的 10条SQL select * from (select v.sql_id, v.child_number, v.sql_text, v.elapsed_time, v.cpu_ ...