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

struts2第十六讲学习笔记,上传文件

2017-06-04 17:18 323 查看
1.单个文件上传

struts2的文件上传功能是apache下的comoms-fileupload来实现的

单个文件上传的jsp页面要点,要求必须是post提交,并且enctype="multipart/form-data"
jsp页面

<body>

<form action="upload.action" method="post" enctype="multipart/form-data">
文件:<input type="file" name="file"/>
<input type="submit" value="上传"/>
</form>
</body>
配置文件要点,主要是对文件大小的控制fileUpload拦截器的maximumSize和struts2的静态属性struts.mutilpart.maxSize。

maxSize大于等于maximumSize

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
<!--从struts.core包的struts2包里的default.properties中拿到数据 -->
<!-- maxSize必须大于等于maximumSize -->
<constant name="struts.multipart.maxSize" value="20971520"/>
<constant name="struts.multipart.saveDir" value="d:\default"/>
<package name="hello" extends="struts-default" namespace="/">
<interceptors>
<interceptor-stack name="myStack">

<!--引用fileUpload拦截器,从core包的struts-default.xml中找到  -->
<interceptor-ref name="fileUpload">
<param name="maximumSize">20971520</param>
</interceptor-ref>

<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>

<default-interceptor-ref name="myStack" />
<action name="upload" class="action.UploadAction" method="upload">
<result>/success.jsp</result>

<!--做到凡是有result的地方心中都有拦截器-->

</action>

</package>
</struts>
action代码要点,在Action中必须提供三个属性,一个是File类型,名称是跟表单元素的名称一致,其它两个是表单元素名+FileName与表单元素名+ContentType,并提供get和set方法(凡是加入一个属性,基本上都需要get和set方法)

package action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport{
private static final long serialVersionUID = 1L;
属性必须生成get和set方法
private File file;//将上传的文件封装成对象 

//从JSP页面接收到的文件名
private String fileFileName;

//文件类型
private String fileContentType;


public String upload() throws IOException{
//先拿到request对象,为了设置默认的上传根路径
HttpServletRequest request = ServletActionContext.getRequest();
@SuppressWarnings("deprecation")
String path = request.getRealPath("/upload");
InputStream in = new FileInputStream(file);//读取流关联文件
System.out.println(file.exists());
File file = new File(path,fileFileName);
OutputStream out = new FileOutputStream(file);
System.out.println(file);//打印路径,为了找到这个根路径
int len = 0;
byte [] buf = new byte[1024];
while((len=in.read(buf))!=-1){
out.write(buf,0,len);
System.out.println("read!");
}
in.close();
out.close();
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;
}

}
2.批量文件上传 batchUpload

JSP页面要点,多个<input type="file"
name="file" >,它们的name都是file.

写一个JSP页面,内嵌一些JS脚本,添加这个上述input标签

<body>
<form action="bacthUpload.action" method="post"enctype="multipart/form-data">
<table id="tabid">
<tr>
<td><a href="javascript:void(0)" onclick="demo()">添加附件</a></td>
</tr>
</table>
<input type="submit" value="上传" />
</form>

</body>

<!--
通过表单对象创建行对象,在通过行对象创建列对象,创建两个,一个用于删除,一个用于添加附件

-->
<script type="text/javascript">

function demo()

{
var oTabNode = document.getElementById("tabid");//拿到表格对象为了创建行
var oTrNode = oTabNode.insertRow();//通过表格创建行
var oTdNode_file= oTrNode.insertCell();//通过行创建单元格
var oTdNode_del = oTrNode.insertCell();//通过行创建列

oTdNode_file.innerHTML = "<input type='file' name='file'/>";
oTdNode_del.innerHTML = "<a href='javascript:void(0)' onclick='deletee(this)'>删除文件</a>";

}

function deletee(node){
oTrNode = node.parentNode.parentNode;//a的父是td,td的父是tr
oTrNode.parentNode.removeChild(oTrNode);

}

</script>
配置文件代码struts.xml

<action name="bacthUpload" class="action.batchUploadAction" method="batchUpload">
<result>/success.jsp</result>
<!--配置上传拦截器最大上传限制是20M,不允许超过struts的静态属性 -->
<interceptor-ref name="fileUpload" >
<param name="maximumSize">20971520</param>

</interceptor-ref>

<interceptor-ref name="defaultStack"/>

</action>
配置文件指向指定的java类,这个Action的代码如下,要点是从页面接收的是许多File,所以用数组接收,并且生成get和set方法

package action;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.Action;

import com.opensymphony.xwork2.ActionSupport;

public class batchUploadAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private File[] file;//与JSP页面的表单元素名一致
// 文件名
private String[] fileFileName;
// 文件类型
private String[] fileContentType;


public String batchUpload() throws IOException {
HttpServletRequest request = ServletActionContext.getRequest();
@SuppressWarnings("deprecation")
String path = request.getRealPath("/upload");
for (int i = 0; i < file.length; i++) {
InputStream in = new FileInputStream(file[i]);//根据数组中的每个对象关联一个读取流
System.out.println("上传文件存在吗?:" + file[i].exists());
File file = new File(path, fileFileName[i]);//为每一个文件关联一个相对应的文件名对象
OutputStream out = new FileOutputStream(file);//根据文件名创建输出流
System.out.println("上传文件保存的路径:" + file);
int len = 0;
byte[] buf = new byte[1024];
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
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;
}

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