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

struts2单文件和多文件的上传

2016-04-06 19:46 357 查看
在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来比较繁琐,而且不灵活,在学习了struts2后,struts2为文件上传下载提供了更好的实现机制,在这里我分别就单文件上传和多文件上传的源代码进行一下讲解,这里需要导入文件下载上传的两个jar文件,一个是commons-fileupload-1.2.2.jar,另一个是commons-io-2.0.1.jar

struts2单文件上传:

首先是一个jsp文件上传页面,这个比较简单,就是一个表单,里面有个文件上传框
<form action="fileUpload.action" method="post" enctype="multipart/form-data">
username:<input type="text" name="username"><br>
file:<input type="file" name="file"><br>

<input type="submit" value="submit">
</form>
接下来是UploadAction部分代码,因为struts2对上传和下载都提供了很好的实习机制,所以在action这段我们只需要写很少的代码就行:
package com.shengsiyuan.struts2;

import java.io.*;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport {

private String username;
private File file;
private String fileFileName;  //上传的文件名
private String fileContentType;  //上传的文件类型

public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
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;
}

@Override
public String execute() throws Exception {
String root = ServletActionContext.getRequest().getRealPath("/upload");

InputStream is = new FileInputStream(file);

System.out.println("path: " + file.getAbsolutePath());

System.out.println("file: " + file.getName());

System.out.println("fileFileName: " + fileFileName);

File destFile = new File(root, fileFileName);

OutputStream os = new FileOutputStream(destFile);

byte[] buffer = new byte[400];

int length = 0;

while(-1 != (length = is.read(buffer)))
{
os.write(buffer, 0, length);

Thread.sleep(1000);
}

is.close();
os.close();

return SUCCESS;
}
}

结果显示页面:

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML>
<html>
<head>
<title></title>
</head>

<body>

username:<s:property value="username"/><br>

name:<s:property value="fileFileName"/>
<br>
type:<s:property value="fileContentType"/>
</body>
</html>
首先我们要清楚一点,这里的file并不是真正指代jsp上传过来的文件,当文件上传过来时,struts2首先会寻找struts.multipart.saveDir(这个是在default.properties里面有)这个name所指定的存放位置。
struts2在进行文件上传操作时,实际是通过两个步骤实现的:

1. 首先将客户端传上来的文件保存在struts.multipart.saveDir键所指定的目录中,如果该键所对应的目录不存在的话,那么就保存到javax.servlet.context.tempdir环境变量所指定的目录中;

2.Action中所定义的File类型的成员变量file实际指向的是临时目录中的临时文件,然后在服务器端通过IO方式将临时文件写入到指定的服务器端目录中。

struts2多文件上传:

首先,表单:

<form action="fileUpload2.action" method="post" enctype="multipart/form-data">

username: <input type="text" name="username"><br>
file: <input type="file" name="file"><br>
file2: <input type="file" name="file"><br>
file3: <input type="file" name="file"><br>

<input type="submit" value="submit">

</form>然后是处理的UploadAction2:
package com.shengsiyuan.struts2;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction2 extends ActionSupport
{
private String username;

private List<File> file;

private List<String> fileFileName;

private List<String> fileContentType;

public String getUsername()
{
return username;
}

public void setUsername(String username)
{
this.username = username;
}

public List<File> getFile()
{
return file;
}

public void setFile(List<File> file)
{
this.file = file;
}

public List<String> getFileFileName()
{
return fileFileName;
}

public void setFileFileName(List<String> fileFileName)
{
this.fileFileName = fileFileName;
}

public List<String> getFileContentType()
{
return fileContentType;
}

public void setFileContentType(List<String> fileContentType)
{
this.fileContentType = fileContentType;
}

@Override
public String execute() throws Exception
{
for(int i = 0; i < file.size(); i++)
{
InputStream is = new FileInputStream(file.get(i));

String root = ServletActionContext.getRequest().getRealPath("/upload");

File destFile = new File(root, fileFileName.get(i));

OutputStream os = new FileOutputStream(destFile);

byte[] buffer = new byte[400];

int length = 0;

while(-1 != (length = is.read(buffer)))
{
os.write(buffer, 0, length);
}

is.close();
os.close();
}

return SUCCESS;
}

}
最后是结果显示页面:
username: <s:property value="username"/><br>

<s:iterator value="fileFileName" id="f">

file: <s:property value="#f.toUpperCase()"/><br>

</s:iterator>注:上面代码中的#是OGNL:对象图导航语言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: