`
kerne
  • 浏览: 15015 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

最近在写一个导入上传系统,写了几个通用代码试试[上传,解压,数据分析,文件操作]

阅读更多
  最近在写一个导入上传系统,发现smartupload他只有上传一些小的文件,一但大的文件就反应很慢,上传速度也很慢,后来又在网上找了,commons-fileupload这个上传文件,看了不少人写的代码,那我总结了一下,试着写了一个,如哪里不好,请朋友们给我指出来。
代码如下:
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;

/**
 * commons-fileupload 文件上传,同时可以上传多个文件<br />
 * <li>使用:FileUpload.getInstance.getUploadFile(HttpServletRequest request);</li>
 * 
 * @author HuangFeng
 * 
 */
public class FileUpload {

	private static FileUpload fileupload = null;

	private FileUpload() {
	}

	/**
	 * 获得上传文件实例
	 * 
	 * @return 实例
	 */
	public static FileUpload getInstance() {
		if (null == fileupload) {
			return new FileUpload();
		} else {
			return fileupload;
		}
	}

	/** 上传目录 */
	private String uploadDir = "/uploadMdb/file/";

	/** 上传文件最大限制 */
	private long fileMaxSize = 100 * 1024 * 1024;
	
	/** 文件磁盘存在真实目录 */
	private String fileRealPath = "";
	
	/** 文件列表 */
	private List<String> fileList = new ArrayList<String>();
	
	/**
	 * 上传文件
	 * @param request
	 */
	public boolean getUploadFile(HttpServletRequest request) {
		try {
			DiskFileUpload fu = new DiskFileUpload();
			
			// 设置允许用户上传文件大小,单位:字节
			fu.setSizeMax(fileMaxSize);
			
			// 设置最多只允许在内存中存储的数据,单位:字节
			fu.setSizeThreshold(4096);
			
			// 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
			fu.setRepositoryPath("/temp");
			
			// 开始读取上传信息
			List fileItems = fu.parseRequest(request);

			// 依次处理每个上传的文件
			Iterator iter = fileItems.iterator();
			
			// 创建文件目录
			// 不管目录是否存在
			String filepath = request.getSession().getServletContext().getRealPath(uploadDir);
			FileUtil.getInstance().createFolder(filepath);
			fileRealPath = filepath;
			while (iter.hasNext()) {
				FileItem item = (FileItem) iter.next();
				// 忽略其他不是文件域的所有表单信息
				if (!item.isFormField()) {
					String name = item.getName();
					long size = item.getSize();
					if ((name == null || name.equals("")) && size == 0) {
						continue;
					}
					// 注意item.getName()
					// 会返回上载文件在客户端的完整路径名称,这似乎是一个BUG。
					// 为解决这个问题,这里使用了fullFile.getName()。
					name = name.replace('\\', '/');
					File fullFile = new File(name);
					File savedFile = new File(filepath, fullFile.getName());
					fileList.add(fullFile.getName());
					item.write(savedFile);
				}
			}
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	public long getFileMaxSize() {
		return fileMaxSize;
	}

	/** 上传文件最大限制 */
	public void setFileMaxSize(long fileMaxSize) {
		this.fileMaxSize = fileMaxSize;
	}

	public String getUploadDir() {
		return uploadDir;
	}

	/** 上传目录 */
	public void setUploadDir(String uploadDir) {
		this.uploadDir = uploadDir;
	}
	
	/** 文件列表 */
	public List getFileList() {
		return fileList;
	}

	/** 文件磁盘存在真实目录 */
	public String getFileRealPath() {
		return fileRealPath;
	}

}


上传这后文件就需要解压,解压时老是报错,后来发现是中文问题,网上找了很多的解决方法,感觉还是有点麻烦,由于在赶进度就没有解决中文问题,但以后有空的话,我就会去研究一下,试着解决这个问题。
代码如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;

/**
 * File :<b>解压zip文件操作类</b><br/> Time :Oct 19, 2007 <br />
 * Note :remark...<br />
 * 
 * @author :HuangFeng
 * @version :1.0
 */
public class UnZipper {
	private static UnZipper unzipper = null;
	
	private UnZipper() {}
	
	/**
	 * @return 解压zip文件操作类 实例
	 */
	public static UnZipper getInstance() {
		if (null == unzipper) {
			return new UnZipper();
		} else {
			return unzipper;
		}
	}
	
	/** 解压文件列表信息 */
	private List<String> msg = null;
	
	/**
	 * 创建字符内容8858-1到GB2312
	 * 
	 * @param str
	 *            内容
	 * @return 创建后的内容
	 */
	private String make8859toGB(String str) {
		try {
			String str8859 = new String(str.getBytes("ISO-8859-1"), "GB2312");
			return str8859;
		} catch (UnsupportedEncodingException ioe) {
			return str;
		}
	}

	/**
	 * 解压到当前文件夹
	 * 
	 * @param fileName
	 *            需要解压的zip文件
	 * @return 解压后的文件个数
	 */
	public int UnZip(String fileName) {
		File infile = new File(fileName);
		return UnZip(fileName, infile.getParent());
	}

	/**
	 * 解压到指定文件夹
	 * 
	 * @param fileName
	 *            需要解压的zip文件
	 * @param outDir
	 *            解压到的目录
	 * @return 解压后的文件个数
	 */
	public int UnZip(String fileName, String outDir) {
		File infile = new File(fileName);
		int num = 0;
		msg = new ArrayList<String>();
		try {
			if (!infile.exists()) {
				throw new IOException(fileName + "文件不存在?");
			}
			// 检查是否是ZIP文件
			ZipFile zip = new ZipFile(infile);
			zip.close();
			// 建立与目标文件的输入连接
			ZipInputStream in = new ZipInputStream(new FileInputStream(infile));
			//如果压缩包里文件有中文名称文件名读取会报错
			ZipEntry file = in.getNextEntry();
			int i = infile.getAbsolutePath().lastIndexOf('.');
			String dirname = outDir;
			File newdir = new File(dirname);
			newdir.mkdir();
			byte[] c = new byte[1024];
			int slen;
			while (file != null) {
				System.out.println(file.getName().replace('/', '\\'));
				msg.add(file.getName().replace('/', '\\'));
				i = make8859toGB(file.getName()).replace('/', '\\').lastIndexOf('\\');
				if (i != -1) {
					File dirs = new File(dirname + File.separator + make8859toGB(file.getName()).replace('/', '\\').substring(0, i));
					dirs.mkdirs();
					dirs = null;
				}
				if (file.isDirectory()) {
					File dirs = new File(dirname + File.separator + make8859toGB(file.getName()).replace('/', '\\'));
					dirs.mkdir();
					dirs = null;
				} else {
					FileOutputStream out = new FileOutputStream(dirname + File.separator + make8859toGB(file.getName()).replace('/', '\\'));
					while ((slen = in.read(c, 0, c.length)) != -1) {
						out.write(c, 0, slen);
					}
					out.close();
				}
				num++;
				file = in.getNextEntry();
			}
			in.close();
		} catch (ZipException zipe) {
			zipe.printStackTrace();
			System.out.println(fileName + "不是一个ZIP文件!");
		} catch (IOException ioe) {
			ioe.printStackTrace();
			System.out.println("读取" + fileName + "时错误!");
		} catch (Exception i) {
			i.printStackTrace();
			new FileNotFoundException("拒绝访问:" + fileName );
		}
		return num;
	}

	/** 解压文件下的列表信息 */
	public List getMsg() {
		return msg;
	}
}


解压后,要把解压的数据展现给B端看,并且分析解压的数据,进行业务处理,这里处理业务这一块就不贴出来了,但这些数据分析需要时时更新给B端,显示进度,唉,真烦啊,等数据分析完成并再把相应的文件进行拷贝,删除上传的压缩包等等。最后再给一个处理结果,其实在这里最难的还是处理进度的显示。唉,老要命啊!
下面是文件操作类,拷贝,删除等。
代码如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * File :<b>File.java</b><br/> 
 * Time :Oct 19, 2007 <br />
 * Note :文件基本操作类.使用方法:FileUnit.getInstance().XX
 * 		<li>1、创建文件目录</li>
 *  	<li>2、创建相应文件</li>
 *  	<li>3、删除目录和文件</li>
 *   	<li>4、文件重命名</li>
 * 		<li>5、将内容写入文件中</li>
 * 
 * @author :HuangFeng
 * @version :1.0
 */
public class FileUtil {
	
	private static FileUtil fileunit = null;

	private FileUtil() {

	}

	/**
	 * @return 文件基本操作类实例
	 */
	public static FileUtil getInstance() {
		if (null == fileunit) {
			return new FileUtil();
		} else {
			return fileunit;
		}
	}
	
	/**
	 * 创建文件
	 * 
	 * @param filepath 文件所在目录路径,比如:c:/test/test.txt
	 * @return 操作
	 */
	public boolean makeFile(String filepath) throws IOException {
		try {
			File file = new File(filepath);
			return file.createNewFile();
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}


	/**
	 * 创建目录
	 * 
	 * @param folderPath:目录路径
	 * @return 操作
	 * @throws IOException 创建错误
	 */
	public boolean createFolder(String folderPath) {
		try {
			File f = new File(folderPath);
			return f.mkdirs();
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	/**
	 * 删除指定路径下的文件<br>
	 * - 有时希望删除文件,比如:图片,文档等.使用方法:removeFile('test.jpg',true); 删除一个文件时flag为true <br>
	 * - 有时希望删除某个目录下的所有文件,使用方法:removeFile('C:\\temp\\',false); <br>
	 * - 注意:如果在删除所有文件的同时也希望删除此目录的话,那么flag = true - removeFile('C:\\temp\\',true);
	 * @param fileUrl 文件或是目录
	 * @param flag 是否删除本目录
	 * @throws Exception 文件不存在. 或是 文件拒绝访问.
	 */
	public void removeFile(String fileUrl , boolean flag) throws Exception {
		File file = new File(fileUrl);
		//文件或目录是否存在.
		if (!file.exists()) {
			throw new FileNotFoundException("指定目录不存在:" + file.getName());
		}
		// 保存中间结果
		boolean rslt = true;		
		//先尝试直接删除,此文件或是目录
		//若是文件则直接删除,不能删除文件为拒绝访问.
		//若文件夹且非空。枚举、递归删除里面内容
		if (!(rslt = file.delete())) {
			File[] subs = file.listFiles();
			if (null == subs ) {
				//有些系统文件无法删除, 也不是文件夹,所以获得文件列表是空的.
				throw new Exception("文件拒绝访问:" + file.getName());
			}
			for (int i = 0; i <= subs.length - 1; i++) {
				if (subs[i].isDirectory()){
					//递归删除子文件夹内容
					removeFile(subs[i].toString() , flag);
				}
				// 删除子文件夹本身
				rslt = subs[i].delete();
			}
			//删除文件: flag = false | flag = true 都可以
			//删除目录: 
			//flag = false 则删除目录下所有的文件,不包括目录
			//flag = true  则删除目录下所有的文件及目录本身
			if (flag) {
				rslt = file.delete();
			}
		}
		if (!rslt) {
			throw new Exception("无法删除:" + file.getName());
		}
	}

	/**拷贝文件<br >
	 * 拷贝文件时只拷贝文件,而不会自动创建目录,文件目录一定要存在,
	 * 否则 throws FileNotFoundException(); - 找不到文件目录.
	 * @param copyPath 拷贝源文件的目录
	 * @param copyToPath 需要拷贝到哪个目录
	 * @return 拷贝是否成功
	 * @throws FileNotFoundException 
	 */
	public boolean copyFile(String copyFile , String copyToFile) throws FileNotFoundException {
		try {
			//建立目标文件
			File file = new File(copyFile);
			
			// 把文件读入
			FileInputStream fileIO = new FileInputStream(file);
			
			/*
			 * 建立一个文件的输出流 如果是linux系统请把Files后的"\\"换成"/"
			 */
			FileOutputStream fileOUT = new FileOutputStream(copyToFile);
			int bytesRead = 0;
			byte[] buffer = new byte[8192];
			while ((bytesRead = fileIO.read(buffer, 0, 8192)) != -1) {
				// 将文件写入服务器
				fileOUT.write(buffer, 0, bytesRead);
			}
			fileOUT.close();
			fileIO.close();
			return true;
		} catch (FileNotFoundException fe) {
			throw new FileNotFoundException (copyToFile + "此文件目录找不到!");
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	
	/**
	 * 文件重命名<br/>
	 * <li>需要重命名的文件路径filePath一定要存在,否则报FileNotFoundException找不到文件</li>
	 * <li>新文件名,不能与同目录下的文件名同名,否则报Exception-文件已存在或文件拒绝访问。</li>
	 * @param filePath 需要重命名的文件路径 - “C:\1.txt”
	 * @param newName 新文件名
	 * @return 操作是否成功
	 */
	public boolean renameFile(String filePath, String newName) {
		try {
			File f = new File(filePath);
			//判断文件是否存在
			if (f.exists()) {
				//获得目录
				String fileParent = f.getParent();
				//创建新文件名
				File rf = new File(fileParent + "//" + newName);
				if (f.renameTo(rf)) {
					return true;
				} else {
					throw new Exception(rf + "文件已存在或文件拒绝访问。");
				}
			} else {
				throw new FileNotFoundException(filePath + "文件不存在。");
			}
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	/**
	 * 将内容写入文件中
	 * 
	 * @param filepath 文件所在物理路径
	 * @param content 写入内容
	 */
	public void WriteFile(String filepath, String content) {
		try {
			FileWriter filewriter = new FileWriter(filepath, true);
			PrintWriter printwriter = new PrintWriter(filewriter);
			printwriter.println(content);
			printwriter.flush();
			printwriter.close();
			filewriter.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		FileUtil.getInstance().WriteFile("C:\\log.text", "我试试");

	}
}


好了任务完成。
分享到:
评论
4 楼 小玩子 2008-02-29  
希望有时间大家能交流一下吧
3 楼 小玩子 2008-02-29  
我想请教一下中文问题你有没有解决啊我现在也在做这方面的应用也遇到了同样的中文问题
2 楼 kerne 2007-12-12  
[jones]
上传过程中/tem目录下产生的临时文件没有删除,如果频繁上传大文件估计你系统运行几个月硬盘就满了,呵呵

回复:
我想没有吧,因为文件上传时[/temp]只是做为临时存放文件,在上传后,文件被重命名存放到指定目录里。
1 楼 jones 2007-12-11  
上传过程中/tem目录下产生的临时文件没有删除,如果频繁上传大文件估计你系统运行几个月硬盘就满了,呵呵

相关推荐

    通用导入Excel

    在IT行业中,数据导入是一项常见的任务,特别是在数据分析、报表生成以及数据库管理等领域。"通用导入Excel"是一个功能强大的工具,它允许用户通过简单的接口将Excel数据导入到各种系统中。这个工具的特点在于其通用...

    Excel通用Excel库存管理系统.zip

    在压缩包内的“Excel通用Excel库存管理系统”文件中,我们可以期待看到以下几个关键部分: 1. **基本信息表**:通常会包括产品编号、产品名称、规格型号、供应商信息、库存数量等字段,用于记录每个库存商品的详细...

    csv-fortran使用现代Fortran读写CSV文件

    csv-fortran库设计的核心目标是提供一个简洁、高效的接口,允许用户通过Fortran代码高效地处理CSV文件。这个库的使用可以极大地简化文件操作,使开发者能够将更多精力集中在核心的计算逻辑上,而不是文件I/O的细节上...

    C#地区5级json数据,细化到村屯代码.zip

    标题 "C#地区5级json数据,细化到村屯代码.zip" 暗示了这是一个与C#编程语言相关的项目,其中包含用于处理中国地区层级数据的JSON格式信息,精细到村级。描述中的".zip"表明这是一个压缩包,内含多个文件,用于存储...

    osgb倾斜摄影数据

    1. **数据结构**:OSGB文件通常包含一个主文件和多个子文件,主文件存储全局信息,如坐标系统、空间参考、元数据等,子文件则包含具体的几何和属性数据。 2. **空间参考**:理解OSGB数据的投影方式至关重要,因为它...

    Wavewin Comtrade .zip

    综合来看,Wavewin Comtrade是一个强大的电力系统暂态数据分析工具,它支持COMTRADE格式的数据,具有波形分析、采样点检查、通用性强等优点,是电力工程师和研究人员不可或缺的分析助手。通过提供的压缩包文件,用户...

    vc++ 应用源码包_5

    操作大文件,自定义了一个操作大文件的类,并进行了测试。 chapter7 实现了声音录制等功能。 CHtmlViewProjV2 详细演示了HtmlView的使用与HtmlView事件站点拦截的实现、js调用。 CIVStringSet_Demo 自定义了一个...

    这是一个药品管理系统,功能包括进货,销售,用户管理,药品信息管理,可以给要做毕设的同学参考一下,数据库放在webCo.zip

    在这个系统中,我们主要关注以下几个核心功能: 1. 进货管理:该功能允许用户跟踪药品的采购过程,包括供应商信息、药品规格、数量、单价、总价等。系统可以自动计算库存变化,并生成采购订单,帮助用户高效地进行...

    高档精致银灰色企业通用型网站源码 v1.0-ASP源码.zip

    "高档精致银灰色企业通用型网站源码 v1.0" 提示这是一个设计精良、适合企业使用的网站模板。源码可能是由经验丰富的开发者编写的,采用了银灰色调,给人一种专业且高端的感觉。通常,这样的源码会包含首页、关于我们...

    vc++ 应用源码包_1

    操作大文件,自定义了一个操作大文件的类,并进行了测试。 chapter7 实现了声音录制等功能。 CHtmlViewProjV2 详细演示了HtmlView的使用与HtmlView事件站点拦截的实现、js调用。 CIVStringSet_Demo 自定义了一个...

    vc++ 应用源码包_6

    操作大文件,自定义了一个操作大文件的类,并进行了测试。 chapter7 实现了声音录制等功能。 CHtmlViewProjV2 详细演示了HtmlView的使用与HtmlView事件站点拦截的实现、js调用。 CIVStringSet_Demo 自定义了一个...

    vc++ 应用源码包_2

    操作大文件,自定义了一个操作大文件的类,并进行了测试。 chapter7 实现了声音录制等功能。 CHtmlViewProjV2 详细演示了HtmlView的使用与HtmlView事件站点拦截的实现、js调用。 CIVStringSet_Demo 自定义了一个...

    vc++ 应用源码包_3

    操作大文件,自定义了一个操作大文件的类,并进行了测试。 chapter7 实现了声音录制等功能。 CHtmlViewProjV2 详细演示了HtmlView的使用与HtmlView事件站点拦截的实现、js调用。 CIVStringSet_Demo 自定义了一个...

    RoadFlow 最新源代码

    通过对 RoadFlow 最新源代码的分析,我们可以看到一个成熟的工作流引擎是如何设计和实现的。理解并掌握这些知识,将有助于开发者在企业级应用开发中更好地运用 RoadFlow,提升工作效率,同时也为定制化开发提供了...

    28-全国分省微博签到数据2019年10月wgs84坐标系-广西.zip

    标题中的“28-全国分省微博签到数据2019年10月wgs84坐标系-广西.zip”表明这是一个关于2019年10月微博用户在广西地区签到的数据集,已经按照地理位置信息进行了整理。这个数据集可能是用于地理数据分析、社会网络...

    vc++ 开发实例源码包

    操作大文件,自定义了一个操作大文件的类,并进行了测试。 chapter7 实现了声音录制等功能。 CHtmlViewProjV2 详细演示了HtmlView的使用与HtmlView事件站点拦截的实现、js调用。 CIVStringSet_Demo 自定义了一个...

    ecms 会员excel导出

    总结来说,“ecms 会员excel导出”是ECMS系统中的一个重要功能,它允许用户将会员数据导出到Excel格式,方便管理和分析。修复后的功能适应了ECMS 7.0版本,提供了更稳定的数据导出服务。而“excelinfo”文件则可能...

    参考资料-001-表C.0.3 强制措施条文检测记录.zip

    标题中的“参考资料-001-表C.0.3 强制措施条文检测记录.zip”表明这是一个关于强制措施条文检测记录的压缩文件,主要用于提供相关行业的法规检查或审计依据。描述中的内容与标题相同,进一步确认了文件的主题。标签...

    jfreechart所需jar包.zip

    在Java应用程序中,JFreeChart经常被用于数据分析和可视化,尤其在报表系统、数据分析工具或者任何需要展示数据图形化的场景中。"jfreechart所需jar包.zip"是一个包含了使用JFreeChart库所必需的Java归档(JAR)文件...

    111交货排期表.zip

    在Windows系统中,用户可以通过右键菜单直接解压.zip文件,也可以使用第三方软件如WinRAR或7-Zip进行操作。 2. **Excel文件**:.xls是Microsoft Excel的文件格式,用于创建和编辑电子表格。交货排期表.xls很可能是...

Global site tag (gtag.js) - Google Analytics