`
hyj0903
  • 浏览: 151252 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

struts1.x实现多文件上传1.0(笔记)

阅读更多
以下代码如果没有耐心千万不要看,很费时的,自己觉得这个实现方式实在是太不给力了。
1.前台表单:
<script type="text/javascript"> 
   var t = 1; 
   function addFileInput() 
   { 
    var parent = document.getElementById("more"); 

    var br = document.createElement("br"); 
    var input = document.createElement("input"); 
    var button = document.createElement("input"); 

    input.type = "file"; 
    input.name = "uploadFile[" + (t++) + "].file"; 
    input.size = "30"; 
    button.type = "button"; 
    button.value = "删除"; 

    button.onclick = function() 
    { 
     parent.removeChild(br); 
     parent.removeChild(input); 
     parent.removeChild(button); 
    
    }; 

    parent.appendChild(br); 
    parent.appendChild(input); 
    parent.appendChild(button); 
   } 
</script> 



<td id="more"><!--
				<html:file property="uploadFile[0].file" /><br/>
				<html:file property="uploadFile[1].file" /><br/>
				<html:file property="uploadFile[2].file" />
				  -->
				<input type="file" name="uploadFile[0].file" size="30">
				<input type="button" onclick="addFileInput();" value="增加">
			</td>

  

 2. FileAction.java

	/**
	 * 文件上传实现1.0
	 */
	public ActionForward addFile(ActionMapping mapping, ActionForm form, 
			HttpServletRequest request, HttpServletResponse response){
		FileForm fileForm = (FileForm)form;
		List<UploadFile> uploadFiles =  fileForm.getFormFiles();
		// result = 0;
		if(uploadFiles != null){
			String root=request.getSession(true).getServletContext().getRealPath("/heyjdemo/upfiles/"); 
			FileUploadTool fileUploadTool = new FileUploadTool();
			fileUploadTool.saveFile(uploadFiles, root);
			
			/*
			 *将文件信息保存到数据
			 */
			
		}
		

		return mapping.findForward("success"); 
	}

 

 

 

3. FileUploadTool.java

 

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.struts.upload.FormFile;

/**
 * <p> 描述:  文件上传工具类,每次上传的文件都上传到时upifles目录中,根据年月别保存到
 * 				相应的目录下,如当年月为2011-3 则文件相应的路径为:/upfiles/2010_3/
 * </p>
 *
 * <p> 原则:
 * 
 *  	如果是单文件上传,用户界面文件表单为:<html:file property="formFile" />
 *      如果是多文件上传,用户界面文件表单为如下格式,其中uploadFile数组大小可以任意,建议不要太大:
 *      			<html:file property="uploadFile[0].file" /><br/>
				<html:file property="uploadFile[1].file" /><br/>
				<html:file property="uploadFile[2].file" />
 *  </p>
 *
 * <p> 作用:	1.文件名,文件路径,文件大小,文件类型,将文件保存到磁盘(支持多文件上传)
 *    			2.删除磁盘中的文件
 *    			3.垃圾文件(夹)清理 未实现*************************
 * 				4.断点续传未实,现期待给力哥***********************
 * 			
 *  </p>
 *
 * <p> Create Date:2011-3-14 </p>
 * 
 */
public class FileUploadTool {
	
	/**
	 * 保存单个文件后所得到的信息
	 */
	private String fname = "";
	private String furl = "";
	private String ftype = "";
	private float fsize = 0;
	
	/**
	 * 保存多个 文件后所得到的信息
	 */
	private List<String> fnames;
	private List<String> furls;
	private List<String> ftypes;
	private List<Float> fsizes;
	
	public String getFname() {
		return fname;
	}
	public String getFurl() {
		return furl;
	}
	public String getFtype() {
		return ftype;
	}
	public float getFsize() {
		return fsize;
	}
	public List<String> getFnames() {
		return fnames;
	}
	public List<String> getFurls() {
		return furls;
	}
	public List<String> getFtypes() {
		return ftypes;
	}
	public List<Float> getFsizes() {
		return fsizes;
	}

	/**
	 * 获得唯一的字符串前缀
	 * 使用日期+随机数
	 * @return
	 */
	public String getUniqueString(){
		Date date = new Date();
		SimpleDateFormat   simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String currrentDateStr = simpleDateFormat.format(date);
		int  randInt = (int)( Math.random()*10000);
		String uniqueStr = (currrentDateStr + randInt).replaceAll(" ", "")
			.replaceAll(":", "").replaceAll("-", "");
		return uniqueStr;
	}
	
	/**
	 * 保存单个文件,
	 *  当返回为1时,保存文件成功,当返回为0时,保存不成功
	 * @param file
	 * @param preFurl
	 * @param preFname
	 * @return
	 */
	public int saveFile(FormFile file, String root, String preFname){
		
			//保存文件
			try{
				fsize = file.getFileSize();
				/**
				 * 当文件大小为0时不上传此文件
				 */
				if(0 == fsize){
					return 0;
				}
				String[] tempStr = preFname.split("\\.");
				if(tempStr.length>0){
					ftype = tempStr[tempStr.length - 1 ];
				}
				fname = getUniqueString();
				furl = root + "\\" + fname;
				if(!"".equals(ftype)){
					furl += "." + ftype;
				}
				
				InputStream in = file.getInputStream();
				System.out.println(furl);
		        OutputStream out = new FileOutputStream(furl);  
		        int read = 0;  
		        //fsize = 0;
		        byte[] buffer = new byte[1024];  
		        while((read = in.read(buffer,0,1024)) != -1){  		   
		            out.write(buffer, 0, read);
		           // fsize += read;
		        }  
		        in.close();  
		        out.close();
			}catch(Exception e){
				e.printStackTrace();
				return 0;
			}
			
			///fsize /= 1024;//转换成kb
			
			return 1;
	}
	
	/**
	 * 保存多个文件
	 * 利用保存单个文件的功能模块来实现多文件保存
	 * @param files
	 * @param url
	 */
	public void saveFile(List<UploadFile> files, String root){
		/*
		 * 初始化
		 */
		fnames = new ArrayList<String>();
		furls = new ArrayList<String>();
		ftypes = new ArrayList<String>();
		fsizes = new ArrayList<Float>();
		
		/*
		 * 保存文件
		 */
		for(UploadFile file : files){
			FormFile formFile = file.getFile();
			if(formFile == null){
				continue;
			}
			saveFile(formFile,root,formFile.getFileName());
			fnames.add(fname);
			furls.add(furl);
			ftypes.add(ftype);
			fsizes.add(fsize);
		}
	}
	/**
	 * 删除单个文件
	 * @param furl
	 */
	public boolean deleteFile(String furl){
		java.io.File file = new java.io.File(furl);
		if(file.exists()){
			file.delete();
			return true;
		}else{
			return false;
		}
	}
	
	/**
	 * 删除多个文件
	 * @param furls
	 */
	public List<Boolean> deleteFile(List<String> furls){
	
		List<Boolean> results = new ArrayList<Boolean>();
		for(String furl : furls){
			results.add(deleteFile(furl));
		}
		return results;
	}
	
	public void cleanRubbishFiles(){
		
	}
}

 

 

4. FileForm.java

 

/**
 * <p> 描述:  文件DAO</p>
 *
 * <p> 原则:
 *    	如果是单文件上传,用户界面文件表单为:<html:file property="formFile" />
 *      如果是多文件上传,用户界面文件表单为如下格式,其中uploadFile数组大小可以任意,建议不要太大:
 *      		<html:file property="uploadFile[0].file" /><br/>
				<html:file property="uploadFile[1].file" /><br/>
				<html:file property="uploadFile[2].file" />
 *  </p>
 *
 * <p> 作用: </p>
 *
 * <p> Create Date:2011-3-14 </p>
 * 
 */
public class FileForm extends ActionForm {
	
	private File file = new File();

	private List<File> files;
	
	private Page page = new Page(1,3);
	
	/**
	 * Struts文件表单域
	 */
	private FormFile formFile;
	
	/**
	 * 多个文件
	 * @return
	 */
	private List<UploadFile> formFiles = new ArrayList<UploadFile>();
	
	public File getFile() {
		return file;
	}

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

	public List<File> getFiles() {
		return files;
	}

	public void setFiles(List<File> files) {
		this.files = files;
	}

	public Page getPage() {
		return page;
	}

	public void setPage(Page page) {
		this.page = page;
	}

	public FormFile getFormFile() {
		return formFile;
	}

	public void setFormFile(FormFile formFile) {
		this.formFile = formFile;
	}

	public List<UploadFile> getFormFiles() {
		return formFiles;
	}

	public void setFormFiles(List<UploadFile> formFiles) {
		this.formFiles = formFiles;
	}

	public FileForm(){
		
	}
	
	/**
	 * 注意这个方法的定义 不加中间的循环是会出错的,
	 * struts1多文件上传时,是数组 ----》list的过程,不能类型转换 
	 * @param index
	 * @return
	 */

	public UploadFile getUploadFile(int index) { 
	   int size = formFiles.size(); 
	   if (index > size - 1) { 
	    for (int i = 0; i < index - size + 1; i++) { 
	    	formFiles.add(new UploadFile()); 
	    } 
	   } 
	   return (UploadFile) formFiles.get(index); 
	} 


	
}

 

 

5.UploadFile.java

import java.io.Serializable;

import org.apache.struts.upload.FormFile;

/**
 * <p> 描述: struts1文件上传时的formfile </p>
 *
 * <p> 原则: </p>
 *
 * <p> 作用: </p>
 *
 * <p> Create Date:2011-3-15 </p>
 * 
  */
public class UploadFile implements Serializable { 

	private FormFile file; 

	public FormFile getFile() { 
	   return file; 
	} 

	public void setFile(FormFile file) { 
	   this.file = file; 
	} 


	} 

 

 

 

分享到:
评论
1 楼 afunti 2011-03-30  
太nb了
这么长
看起来 费神……

相关推荐

    对struts1.x与struts2.x的区别的总结

    Struts1.x与Struts2.x是两种非常流行的Java Web应用程序框架,它们都由Apache软件基金会开发,旨在简化MVC(Model-View-Controller)架构的实现。然而,两者在设计哲学、功能特性以及实现方式上存在显著差异。以下是...

    Struts1.x常用的开发包,需要学习struts1.x朋友可以下载

    6. **国际化与本地化**:Struts1.x支持多语言环境,通过Resource Bundle管理和message.properties文件实现动态加载不同语言的文本资源,提供本地化服务。 7. **Tiles框架**:Tiles是Struts1.x的一个插件,用于构建...

    struts1.x多文件上传

    Struts1.x提供了处理多文件上传的功能,使得开发者可以方便地集成到自己的应用程序中。 在Struts1.x中实现多文件上传,主要涉及以下几个核心概念和步骤: 1. **表单设计**:首先,你需要创建一个HTML表单,包含`...

    struts1.x和struts2.x区别

    综上所述,Struts2.x相对于Struts1.x在多个方面进行了改进和优化,包括但不限于Action的实现方式、工作流程、数据绑定、视图技术以及验证机制,这些改进共同构成了Struts2.x相较于Struts1.x的优势,使其成为现代Web...

    struts1.x技术课程讲解.pdf

    - **第一个程序**:创建一个简单的 Struts1.x 项目,包含基本的 JSP 页面、Action 类和配置文件,实现用户提交表单数据的功能。 - **示例步骤**: 1. 创建一个新的 Web 项目。 2. 配置 Struts1.x 的依赖库。 3. ...

    魔乐科技Struts2.x框架笔记

    **Struts2.x与Struts1.x对比**:相较于Struts1.x,Struts2.x具有更多的优势,如不再强制要求ActionForm,配置文件更简洁,处理流程更加清晰。具体而言,请求首先被过滤器捕获,然后根据`struts.xml`文件的配置调用...

    Struts1.x系列教程(网摘-全)

    8. **国际化与本地化**:Struts1.x支持多语言,通过资源包(properties文件)来实现。你可以为不同的语言创建不同的资源配置文件,Struts会根据用户的浏览器设置自动选择。 9. **异常处理**:Struts1.x提供了异常...

    使用struts1.x上传多个文件的一中方法

    在Struts1.x中,实现文件上传功能是一个常见的需求,特别是在处理用户提交的表单时需要包含多个文件。下面我们将详细介绍如何使用Struts1.x来实现多个文件的上传。 首先,我们需要在HTML表单中添加`...

    Struts1.x的上传文件示例

    在Struts1.x中,实现文件上传功能是一个常见的需求,这通常涉及到处理用户通过表单提交的二进制数据,如图片、文档等。本示例将深入探讨如何在Struts1.x中实现文件上传功能。 首先,你需要在Struts的配置文件...

    java Struts 1.x 框架 Web 开发

    7. **国际化和本地化**:Struts 1.x 支持多语言和文化环境,通过Resource Bundles管理不同地区的文本资源,方便实现国际化。 8. **异常处理**:通过配置全局异常处理,Struts 1.x 可以捕获并处理应用程序中抛出的...

    Struts1.x_Project.zip

    在Struts1.x中,实现I18N(Internationalization)主要是通过资源文件(如*.properties)来管理不同语言的文本。这些文件按照语言和地区进行组织,例如,`message_en.properties`用于英文,`message_zh_...

    Struts1.x的登录示例

    然而,需要注意的是,Struts1.x已经较为过时,现代的Web开发更多地转向了Spring MVC、Play Framework或AngularJS等更现代的解决方案。尽管如此,理解Struts1.x可以帮助我们了解Web框架的发展历程,以及MVC模式在实际...

    struts1.x入门教程

    - 首先,你需要下载Struts1.x的库文件,如struts-1.3.10-all.zip,并将其解压缩。 - 在解压后的lib目录中,你可以找到所有必需的jar文件,包括Struts框架的实现和其他依赖。 - 创建一个新的Web项目,例如myStruts...

    struts1.x apps 所有最新的Struts1.x项目应用

    1. **安装和配置**:了解如何在项目中集成Struts1.x框架,配置web.xml和struts-config.xml文件。 2. **Action和ActionForm**:深入理解这两者的作用,如何编写和使用它们。 3. **视图渲染**:熟悉JSP页面和Struts...

    freemarker for struts 1.x

    freemarker与struts 1.x 结合,生成html 在http://blog.csdn.net/chen1255 的web中有详细描述关于freemarker与struts1.x的结合

    struts1.x实现的网上书店示例

    这个网上书店示例对于学习和理解Struts1.x框架的MVC工作原理,以及如何整合jQuery和Ajax以实现动态交互是非常有价值的。尽管代码可能未完全改造,但它提供了一个实际的起点,让学生或开发者能够进一步实践和优化。

    struts1.x 最简洁国际化 源代码

    Struts1.x是一个经典的Java Web框架,用于构建MVC(模型-视图-控制器)架构的应用程序。在国际化(i18n)方面,Struts1提供了强大的支持,使得应用程序可以适应不同语言和地区的用户需求。以下是关于Struts1.x国际化...

    搭建struts1.x的jar包

    在Struts 1.x中,如果需要在表单中处理文件上传,这个库是必不可少的。 搭建Struts 1.x环境的步骤通常包括以下几点: 1. 将这些jar包添加到你的项目类路径中。 2. 创建`struts-config.xml`配置文件,定义Action、...

    struts1.x 上传下载

    **二、Struts1.x多文件上传** 多文件上传与单文件上传类似,只需在JSP页面中添加多个`&lt;html:file&gt;`标签,每个标签对应一个文件。在ActionForm中,需要为每个文件字段添加相应的属性。 **三、Struts1.x文件下载** ...

Global site tag (gtag.js) - Google Analytics