STRUTS 1 部分
STRUTS 1 的文件上传定义了专门的文件处理接口FormFile。查看源码才知道,FormFile与File完全不是一回事,所以想将FormFile转为File再处理就行不通了。
第一次写上传时,我使用了common-upload组件进行文件上传,后来发现STRUTS在request中根本读不到文件。后来查了一些资料才发现Struts在Action处理逻辑之前已经对request中的表单数据进行了wrap。所以就只能老老实实的按STRUTS自己的文件上传方法写了。
多文件上传与单个文件上传有些不太一样,单文件上传只需要在Form类中给一个FormFile类型的属性,就能接受到页面提交的文件数据。多文件上传时,STRUTS在页面端将多个文件wrap成了一个数组,转给From类时又wrap成了List。所以我们在页面上使用数组形式对文件进行提交,在Form类中用List对文件进行接收。以下是相关的代码:
1.jsp页面代码
<html:file property = "uploadFile[0].file"/>
<html:file property = "uploadFile[1].file"/>
2.Form代码
public class AccuseForm extends ActionForm {
private List evidences;
public AccuseForm(){
evidences = new ArrayList();
evidences.add(new UploadFile());
}
public UploadFile getUploadFile(int index){
int size = evidences.size();
if(index > size - 1){
for(int i = 0; i < index - size + 1; i++){
evidences.add(new UploadFile());
}
}
return (UploadFile)evidences.get(index);
}
public List getEvidences() {
return evidences;
}
public void setEvidences(List evidence) {
this.evidences = evidence;
}
}
public class UploadFile implements Serializable {
private FormFile file;
private String newName;
public FormFile getFile(){
//System.out.println("run in uploadFile.getFile()");
return this.file;
}
public void setFile(FormFile file){
this.file = file;
}
}
3.Action处理代码
public class AccuseAction extends DispatchAction {
public ActionForward save(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response){
AccuseForm f = (AccuseForm)form;
List evidences = f.getEvidences();
try{
String dir = Constants._UPLOAD_DIR;
File fDir = new File(dir);
if(!fDir.exists())
fDir.mkdirs();
for(int i = 0; i < evidences.size(); i++){
UploadFile uploadFile = (UploadFile)evidences.get(i);
uploadFile = renameFile(uploadFile);
if(uploadFile.getFile() == null){
System.out.println("file is null");
break;
}else{
//System.out.println("filename:::" + file.getFileName());
//System.out.println("file size:::" + file.getFileSize());
//System.out.println(dir);
uploadFile(uploadFile, dir);
}
}
}catch(Exception e){
e.printStackTrace();
}
private void uploadFile(UploadFile file, String dir) throws FileNotFoundException, IOException{
InputStream in = file.getFile().getInputStream();
OutputStream out = new BufferedOutputStream(
new FileOutputStream(
dir + file.getNewName()
));
final int _BUFFERSIZE = 8192;
int bytesRead = 0;
byte[] buffer = new byte[_BUFFERSIZE];
while((bytesRead = in.read(buffer, 0, _BUFFERSIZE)) != -1){
out.write(buffer, 0, bytesRead);
}
out.flush();
out.close();
in.close();
}
}
注意,因为我在页面中使用的数组为uploadFile[],所以在Form类中添加了getUploadFile(int index)。因为<html:file/>标签上传的文件在STRUTS中都是由FormFile类接收处理的,所以,在页面中我们使用uploadFile[i].file,它表示的是UploadFile类的file属性,即一个FormFile类对象。
如果,在上传文件中,我们需要对文件进行改名,那么FormFile.setFileName()是用不了的。这个具体为什么我也没有研究,不过我们可以直接将OutputStream输出文件的名字重新换一个就可以了。
STRUTS 2 部分
struts2经过struts1的改进,或者说webwork本身在这方面的功能就比较强大(webwork具体我没怎么研究过),在使用方法上进步了很多,只须以下三步便可以实现多文件的上传。
1.实现action类,使用数组进行存储。需要提供contentType及fileName属性存储相关属性值。
package org.xwood.struts.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.struts2.ServletActionContext;
public class DemoAction{
private String title;
private File[] upload;
private String[] uploadContentType;
private String[] uploadFileName;
/*
//接受依赖注入的属性
private String savePath;
//接受依赖注入的方法
public void setSavePath(String value)
{
this.savePath = value;
}
*/
private String getSavePath() throws Exception
{
return ServletActionContext.getServletContext().getRealPath("upload");
}
public void setTitle(String title) {
this.title = title;
}
public void setUpload(File[] upload) {
this.upload = upload;
}
public void setUploadContentType(String[] uploadContentType) {
this.uploadContentType = uploadContentType;
}
public void setUploadFileName(String[] uploadFileName) {
this.uploadFileName = uploadFileName;
}
public String getTitle() {
return (this.title);
}
public File[] getUpload() {
return (this.upload);
}
public String[] getUploadContentType() {
return (this.uploadContentType);
}
public String[] getUploadFileName() {
return (this.uploadFileName);
}
public String upload() throws Exception
{
File[] files = getUpload();
String path = getSavePath();
for (int i = 0 ; i < files.length ; i++)
{
//以服务器的文件保存地址和原文件名建立上传文件输出流
FileOutputStream fos = new FileOutputStream(path + File.separator + getUploadFileName()[i]);
FileInputStream fis = new FileInputStream(files[i]);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fis.read(buffer)) > 0)
{
fos.write(buffer , 0 , len);
}
fos.close();// 注意:流应当关闭。
fis.close();
}
return "success";
}
}
2.配置action,设置拦截器
<action name = "demo_*"
class = "org.xwood.struts.action.DemoAction"
method = "{1}">
<result name="success" type="dispatcher">/success.jsp</result>
<result name="input">index.jsp</result>
<interceptor-ref name="fileUpload">
<param name="maximumSize">20000</param>
<param name ="allowedTypes">
*
</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
3.配置jsp页面,使用表单上传
注:servlet 2.4之前的版本还得在web.xml中配置clean-up。
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ActionContextCleanUp
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
分享到:
相关推荐
在Struts2中,文件上传功能是一个常用特性,尤其在处理用户提交的多个文件时。本文将详细讲解如何使用Struts2进行多个文件的上传,重点是使用List集合进行上传。 首先,要实现Struts2的文件上传,必须引入必要的...
1. **配置Struts2的文件上传** 在`struts.xml`配置文件中,为需要支持文件上传的Action添加`params`和`fileUpload`拦截器,并设置允许的最大上传大小。例如: ```xml ...
本实例主要探讨如何在Struts1中实现多文件上传功能,并结合Form中传递List类型的数据,这对于理解MVC模式下的文件处理和数据传递有重要作用。我们将深入讨论以下几个关键知识点: 1. **Struts1框架基础**: Struts...
文件上传比较多,多文件上传少一点 文件下载很少的,看似简单,实则不然 网上的Struts2进行的文件下载一般都是单文件或者固定的文件,并没有(很少)实现随意文件的下载的例子 提供多文件上传,上传成功后,提供...
下面将详细介绍如何利用SWFUpload与Struts2来实现多文件上传。 **一、SWFUpload组件介绍** SWFUpload 是一个JavaScript库,它利用Flash技术提供了一个高级的文件上传体验。它的主要特性包括: 1. **多文件选择**...
1. **配置Struts2 Action**:在`struts.xml`配置文件中,你需要定义一个Action,该Action负责处理文件上传请求。Action的类需要继承自`ActionSupport`,并覆盖`execute()`方法,以便处理上传的文件。 2. **设置...
Struts1和Struts2是两个非常著名的Java Web框架,它们都提供了处理文件上传和下载的功能,但实现方式有所不同。本文将深入探讨这两个框架在文件操作方面的具体实现。 首先,让我们了解一下Struts1中的文件上传功能...
这可以通过添加`<constant>`标签来设置`struts.multipart.parser`为jakarta,这是Struts2推荐的多部分解析器,以支持大文件上传。同时,设置`struts.multipart.maxSize`属性,限制上传文件的大小。 ```xml ...
综上所述,Struts1中的文件上传功能实现涉及到多个核心组件和技术点的综合运用。开发者需要对Struts1框架有深入的理解,并熟练掌握相关API的使用方法。此外,在实际开发过程中还需要注意安全性问题,比如防止恶意...
Struts2提供了完善的文件上传支持,让我们来详细探讨如何在Struts2中实现多文件上传。 首先,我们需要在Struts2的配置文件(struts.xml)中启用文件上传的支持。这通常涉及到添加`<constant>`标签来设置`struts....
在处理文件上传时,Struts2提供了便捷的API和配置方式,使得开发人员能够轻松实现多文件上传的功能。下面将详细阐述如何使用Struts2来实现多个文件的上传。 首先,理解文件上传的基本原理。在HTTP协议中,文件上传...
Struts2框架是Java Web开发中的一个流行MVC(Model-View-Controller)框架,它提供了丰富的功能,包括处理表单提交、文件上传等。在Struts2中,文件上传是一个常见的需求,可以帮助用户从客户端上传文件到服务器。...
在文件上传场景中,Struts2主要负责接收前端发送的文件数据,并将这些数据存储到服务器的指定位置。配置Struts2的Action类和相应的XML配置文件,可以定义文件上传的处理逻辑。 接着,jQuery是一个高效、简洁的...
Struts1.x提供了处理多文件上传的功能,使得开发者可以方便地集成到自己的应用程序中。 在Struts1.x中实现多文件上传,主要涉及以下几个核心概念和步骤: 1. **表单设计**:首先,你需要创建一个HTML表单,包含`...
struts2 文件上传 struts2上传标签file fileuploadstruts2 文件上传 struts2上传标签file fileuploadstruts2 文件上传 struts2上传标签file fileupload
2. **后端配置**:在Struts1的配置文件(struts-config.xml)中,你需要为每个文件上传动作创建一个单独的ActionMapping,因为Struts1默认的FileUpload拦截器只能处理单个文件。每个ActionMapping对应一个ActionForm...
Struts2 文件上传是Web开发中的一个重要功能,它允许用户从他们的本地计算机向服务器传输文件。在Struts2框架中,文件上传是通过特定的拦截器实现的,这些拦截器处理了文件上传请求并提供了安全性和大小限制。下面将...
这个压缩包包含了实现Struts2文件上传所需的全部jar包,这些库文件对于理解和实现文件上传功能至关重要。 首先,我们要了解Struts2文件上传的基本流程。当用户通过表单提交包含文件输入字段的请求时,Struts2框架会...
本文将深入探讨Struts1中的文件上传,包括单文件上传、多文件上传,以及解决文件名乱码和重名冲突等问题。 1. **文件上传基础** 文件上传是Web应用中常见的一种功能,允许用户从本地电脑上传文件到服务器。在...
在Struts1.2版本中,实现多文件上传是一项常见的需求,它允许用户在一次提交中上传多个文件,这对于数据交互、资源分享等场景非常实用。在本教程中,我们将深入探讨如何在Struts1.2中实现这一功能。 首先,理解多...