`
hyj0903
  • 浏览: 148274 次
  • 性别: 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了
这么长
看起来 费神……

相关推荐

Global site tag (gtag.js) - Google Analytics