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

最近在写一个导入上传系统,发现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", "我试试");

}
}


好了任务完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值