文章主要解决的有 压缩文件.zip .rar 的处理 和 .csv的处理
文章有多处 注释 均为博主按照自己公司的需求处理文件 所以注释掉大家也可以参照
环境为SpringMVC 主要为 后台处理 前台请百度
1.首先最基本的上传到后台 前台可以用 ajaxfileupload.js 处理 多文件上传
/**
* **文件上传前台发请求到这里
* @param files
* @param request
* @return
*/
@RequestMapping("uploadfile")
@ResponseBody
public void upload(@RequestParam("file") MultipartFile[] files, HttpServletRequest request){
//判断文件大小 可以自行选择要或者不要
if(files!=null){
long sumSize = 32505856;
for(MultipartFile file:files){
if (file.getSize() == 0) {
result.setBool(false);
result.setInfo("文件无内容,请检查");
return result;
}
sumSize -= file.getSize();
}
if(sumSize<=0){
result.setBool(false);
result.setInfo("超过文件上传上限31M!");
return result;
}
}
if(StringUtils.isNotEmpty(json)){
json=json.replaceAll("\\\\", "\\\\\\\\");
}
//这里可根据需求自己更改 如 "/files/path/data/upload" 主要用于存住文件
String uploadURI = "/files/path/data/upload";//上传文件及解压文件目录
//批量上传文件的路径的结果集合
List<List<String>> allFilePaths = null;
try {
//这里的upload方法在下面
allFilePaths = upload(files,uploadURI );//所有文件路径集合
} catch (Exception e1) {
e1.printStackTrace();
/*result.setBool(false);错误处理
result.setInfo("文件上传失败!");
return result;*/
}
//判断上传的文件后缀是否符合规则
if(allFilePaths.get(0).size()==0&&allFilePaths.get(1).size()==0){
result.setBool(false);
result.setInfo("请上传规定后缀名的文件!");
}
//这里的方法也在下面 用于处理压缩文件和普通文件
OflFileBean.upOflFile(allFilePaths);
return void;
}
/** upload 工具方法
* 批量上传文件,并返回压缩文件路径和普通文件路径集合
* @param files 文件集合
* @param uploadDir 上传文件存放目录
* @return list 0-压缩文件路径集合,1-普通文件路径集合
*/
private List<List<String>> upload(MultipartFile[] files,String uploadDir) throws Exception{
long before = System.currentTimeMillis();
List<List<String>> list = new ArrayList<List<String>>();
List<String> zipFilePaths = new ArrayList<String>();//压缩文件路径集合
List<String> comFilePaths = new ArrayList<String>();//普通文件路径集合
FileUtil.createDir(uploadDir); //创建文件目录
//循环上传文件
for(MultipartFile file:files){
String name = file.getOriginalFilename();//文件名称
String filePath = uploadDir+"/"+name;
//判断是否压缩文件
if(name.toLowerCase().endsWith(".zip")||name.toLowerCase().endsWith(".rar")){//压缩文件:以 .zip为后缀
zipFilePaths.add(filePath);
}
if(name.toLowerCase().endsWith(".dat")||name.toLowerCase().endsWith(".txt")||name.toLowerCase().endsWith(".csv") || name.toLowerCase().endsWith(".xls") || name.toLowerCase().endsWith(".dz")){//普通文件,以.txt,.csv为后缀
comFilePaths.add(filePath);
}
File targetFile = new File(filePath);
try {
//这里需要org.apache.commons.io;
FileUtils.copyInputStreamToFile(file.getInputStream(),targetFile);
} catch (Exception e) {
e.printStackTrace();
}
}
list.add(zipFilePaths);
list.add(comFilePaths);
long after = System.currentTimeMillis();
Log.info("文件上传时间:"+(after-before)+"ms");
return list;
}
/*************************************************************************************/
@Service
public class OflFileBean {//文件处理类
private static Pattern p = Pattern.compile("\t|\r|\n");
public void upOflFile(List<List<String>> allFilePaths) {
//根据需求自行更改 如:"/files/path/data/upload"
String uploadURI = "/files/path/data/upload";// 上传文件及解压文件目录
List<String> zipFilePaths = allFilePaths.get(0);// 上传的压缩文件路径集合
List<String> upFilePaths = allFilePaths.get(1);// 上传的普通文件路径集合
upFileData(upFilePaths);//普通文件处理
zipFileData(zipFilePaths, uploadURI );//压缩文件处理
}
// 处理普通文件
private void upFileData(List<String> upFilePaths) {
for (String stringPath : upFilePaths) {// 文件路径
try {
//stringPath 就是文件路径可以对文件进行处理了
List<String[]> fileInfo = getFileInfo(stringPath);// 读取文件
//确定结果
if (fileInfo != null && fileInfo.size() > 0) {
//处理获取的结果 这里可以参考
/*
Map<String, Object> mapdata = new HashMap<String, Object>();
mapdata.put("data", fileInfo);
mapdata.put("fileId", fileId);
byte[] parm = SerializeUtil.gZip(SerializeUtil.serialize(mapdata));
String isoString = null;
try {
isoString = new String(parm, "ISO-8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
RedisUtil.redis_base.lpush("OFFLINEINFO_DATA", isoString, null, true);
*/
} else {
/*失败的参考
Map<String, Object> map = new HashMap<String, Object>();
map.put("code", oflFile.getCode());
map.put("status", "解析失败");
map.put("errorMsg", "未获取文件数据");
oflFileMapper.updateStatus(map);
*/
}
} catch (Exception e) {
e.printStackTrace();
/*失败的参考
Map<String, Object> map = new HashMap<String, Object>();
map.put("code", oflFile.getCode());
map.put("status", "解析失败");
map.put("errorMsg", e.getMessage());
oflFileMapper.updateStatus(map);
*/
}
}
}
//处理压缩文件
@SuppressWarnings({ "rawtypes", "unchecked" })
private void zipFileData(List<String> zipFilePaths, String uploadURI) {
createDir(uploadURI);// 创建解压缩文件路径
// 解压缩文件,并将解压后文件路径放入集合中
List listData = null;
for (String zipFilePath : zipFilePaths) {
listData = new ArrayList();
String[] zipPath = zipFilePath.split("/");// 压缩包文件路径按分割符分割
String zipName = zipPath[zipPath.length - 1];// 压缩包名称
ZipFile zipFile = null;
Archive rarFile = null;
// zip文件处理
if (zipName.toLowerCase().endsWith(".zip")) {
try {
zipFile = new ZipFile(zipFilePath, "UTF-8");//编码
Enumeration<ZipEntry> entryEnum = zipFile.getEntries();
if (entryEnum != null) {
// 解压缩文件
while (entryEnum.hasMoreElements()) {
ZipEntry zipEntry = (ZipEntry) entryEnum.nextElement();
// 不是目录且文件大小大于0
if (zipEntry != null && !zipEntry.isDirectory() && zipEntry.getSize() > 0) {
// 文件路径集合
String[] originalPath = zipEntry.getName().split("/");
// 文件名称
String originalName = originalPath[originalPath.length - 1];
//获取文件路径
int indexOf = originalName.indexOf(".");
String typeName = originalName.substring(indexOf,originalName.length());
String targetFile = uploadDir + "/" + UUID.randomUUID().toString() + typeName;
// 写入文件 方法再类下面
writeZipEntry(targetFile, zipFile, zipEntry);
// 满足.csv 格式文件放入集合中
if (originalName.toLowerCase().endsWith(".csv")){
try {
// 处理文件 参考
//List<String[]> fileInfo = getFileInfo(targetFile);
//放入集合统一处理
listData.addAll(fileInfo);
} catch (Exception e) {
e.printStackTrace();
//处理错误参考
/*Log.error(e.getMessage(), e);
Map<String, Object> map = new HashMap<String, Object>();
map.put("code", oflFile.getCode());
map.put("status", "解析失败");
map.put("errorMsg", e.getMessage());
oflFileMapper.updateStatus(map);*/
}
}
// 移除文件
FileUtil.removeFile(targetFile);
}
}//while
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (zipFile != null) {
zipFile = null;
}
}
} else if (zipName.toLowerCase().endsWith(".rar")) {// rar文件处理
try {
rarFile = new Archive(new File(zipFilePath));
if (rarFile != null) {
FileHeader fh = rarFile.nextFileHeader();
while (fh != null && !fh.isDirectory()) {
String originalName = "";
if (fh.isUnicode()) {// Unicode文件名使用getFileNameW
originalName = fh.getFileNameW().trim();
} else {
originalName = fh.getFileNameString().trim();
}
int typeIndex = originalName.indexOf(".");
String typeName = originalName.substring(typeIndex, originalName.length());
originalName = UUID.randomUUID().toString() + typeName;
if (fh.isDirectory()) { // 是文件夹
File fol = new File(uploadDir + File.separator + originalName);
fol.mkdirs();
} else { // 是文件
File out = new File(uploadDir + File.separator + originalName);
try {
if (!out.exists()) {
// 相对路径可能多级,可能需要创建父目录.
if (!out.getParentFile().exists()) {
out.getParentFile().mkdirs();
}
out.createNewFile();
}
FileOutputStream os = new FileOutputStream(out);
rarFile.extractFile(fh, os);
os.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
fh = rarFile.nextFileHeader();
String targetFile = uploadDir + "/" + originalName;
// 满足 .csv 格式文件解析放入集合中
if (originalName.toLowerCase().endsWith(".csv")) {
try {
// 参考处理文件
//List<String[]> fileInfo = getFileInfo(targetFile);
//放入集合统一处理
listData.addAll(fileInfo);
} catch (Exception e) {
e.printStackTrace();
//错误处理参考
/*Log.error(e.getMessage(), e);
Map<String, Object> map = new HashMap<String, Object>();
map.put("code", oflFile.getCode());
map.put("status", "解析失败");
map.put("errorMsg", e.getMessage());
oflFileMapper.updateStatus(map);*/
}
}
// 移除文件
FileUtil.removeFile(targetFile);
}
rarFile.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (zipFile != null) {
zipFile = null;
}
}
}
//统一处理解压后的文件
try {
//解压的所有文件内容集合处理
if (listData != null && listData.size() > 0) {
//解析成功处理
/*
String fileId = oflFile.getCode();
Map<String, Object> mapdata = new HashMap<String, Object>();
mapdata.put("sn", sn);
mapdata.put("data", listData);
mapdata.put("fileId", fileId);
byte[] parm = SerializeUtil.gZip(SerializeUtil.serialize(mapdata));
String isoString = new String(parm, "ISO-8859-1");
RedisUtil.redis_base.lpush("OFFLINEINFO_DATA", isoString, null, true);*/
} else {
//白处理
/*
Map<String, Object> map = new HashMap<String, Object>();
map.put("code", oflFile.getCode());
map.put("status", "解析失败");
map.put("errorMsg", "未获取文件数据");
oflFileMapper.updateStatus(map);*/
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
/**
* 文件写入本地文件中
* @param targetFile
* @param zipFile
* @param zipEntry
*/
private void writeZipEntry(String targetFile, ZipFile zipFile, ZipEntry zipEntry) {
OutputStream os = null;
InputStream is = null;
try {
os = new BufferedOutputStream(new FileOutputStream(targetFile));
is = zipFile.getInputStream(zipEntry);
byte[] buffer = new byte[4096];
int readlen = 0;
while ((readlen = is.read(buffer, 0, 4096)) >= 0) {
os.write(buffer, 0, readlen);
}
os.flush();
os.close();
is.close();
} catch (ZipException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 解析 csv
public static List<String[]> getFileInfo(String oldFilePath) {
//读取文件
String sourcest = FileUtil.read(oldFilePath);
Scanner scan = new Scanner(sourcest);
Matcher m = null;
List<String[]> list = new ArrayList<String[]>();
String[] cells = null;
while (scan.hasNextLine()) {
try {
String line = scan.nextLine().trim();
m = p.matcher(line);
line = m.replaceAll("");
String[] array = line.split(",");
cells = new String[array.length];
for (int i = 0; i < array.length; i++) {
cells[i] = array[i];
}
list.add(cells);
} catch (Exception e) {
Log.error(e.getMessage(), e);
}
}
scan.close();
return list;
}
/**
* 文件目录不存在,则创建
* @author lxf
* @param dir
*/
public void createDir(String dir){
File fileDir = new File(dir);
if(!fileDir.exists()){
fileDir.mkdirs();
}
}
}
以上就是 本文 对 .zip .rar 和 .csv的处理
因为是第一次做 所以可能会有些错误 希望指出 勿喷 谢谢!