目前部门在做的(大)数据可视化项目中增加了一个模板功能,经过一个星期的摸索,总算是打包提交测试通过了。这里记下一些技术要点,温故知新。
1,模板文件的格式设计
模板导出和导入的文件为一个“模板名称.zip”的压缩包。包内含有一个temp.json文件和若干资源文件(图片,视频,MP3音乐等)。
temp.json文件格式:
{ “content” : ”…”, //模板内容 “thumbnail” : “…”, //模板缩略图 “name” : “…”, //模板名称 “resource” : “…”, //资源路径 “version” : “3.x” //版本 }
2,导出功能
(1),根据id查询待导出模板的content,使用正则表达式匹配其中的资源地址。
//获取content字段中的资源地址 private List<String> getURL(String html){ List<String> list = new ArrayList<String>(); String regex1 = "url\\(([\\s\\S]*?)\\)"; Matcher matcher1 = Pattern.compile(regex1).matcher(html); while (matcher1.find()) { matcher1.start() ; matcher1.end(); matcher1.group(1); String str = matcher1.group(1).trim(); if(str.length() > 3){ list.add(matcher1.group(1).trim()); }; } String regex2 = "src\":\"([\\s\\S]*?)\""; Matcher matcher2 = Pattern.compile(regex2).matcher(html); while (matcher2.find()) { matcher2.start() ; matcher2.end(); matcher2.group(1); String str = matcher2.group(1).trim(); if(str.length() > 3){ list.add(matcher2.group(1).trim()); }; } return list; }
getURL
(2),下载这些资源,存入临时文件夹。
public void download(String urlString, String filename,String savePath) throws Exception { // 构造URL //URL url = new URL( java.net.URLEncoder.encode(urlString,"utf-8")); URL url = new URL(urlString); // 打开连接 URLConnection con = url.openConnection(); //设置请求超时为5s con.setConnectTimeout(5*1000); // 输入流 InputStream is = con.getInputStream(); // 1K的数据缓冲 byte[] bs = new byte[1024]; // 读取到的数据长度 int len; // 输出的文件流 File sf=new File(savePath); if(!sf.exists()){ sf.mkdirs(); } OutputStream os = new FileOutputStream(sf.getPath()+"\\"+filename); // 开始读取 while ((len = is.read(bs)) != -1) { os.write(bs, 0, len); } // 完毕,关闭所有链接 os.close(); is.close(); }
(3),创建temp.json,存入临时文件夹。
JSONObject jsonObject = JSONObject.fromObject(map); String mapStr = jsonObject.toString(); //写入temp.json StringBuffer sb = new StringBuffer(); sb.append(mapStr); String jsonPath = path+"/out/temp.json"; try { OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(jsonPath),"UTF-8"); out.write(sb.toString()); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); }
//遍历文件夹下所有文件 public File[] showAllFiles(File dir) throws Exception{ File[] fs = dir.listFiles(); for(int i=0; i<fs.length; i++){ if(fs[i].isDirectory()){ try{ showAllFiles(fs[i]); }catch(Exception e){ e.printStackTrace(); } } } return fs; }
遍历文件夹下所有文件
(4),打包压缩,向浏览器端输出,用户下载。
//文件打包下载 public HttpServletResponse downLoadFiles(String path,String fileName, List<File> files,HttpServletRequest request, HttpServletResponse response)throws Exception { try { File file = new File(path+"/"+fileName+".zip"); if (!file.exists()){ file.createNewFile(); } response.reset(); //创建文件输出流 FileOutputStream fous = new FileOutputStream(file); ZipOutputStream zipOut = new ZipOutputStream(fous); zipFile(files, zipOut); zipOut.close(); fous.close(); return downloadZip(file,response); }catch (Exception e) { e.printStackTrace(); } return response ; }
//文件压缩 public static void zipFile(List<File> files,ZipOutputStream outputStream) { int size = files.size(); for(int i = 0; i < size; i++) { File file = (File) files.get(i); zipFile(file, outputStream); } } //下载zip包 public static HttpServletResponse downloadZip(File file,HttpServletResponse response) { try { // 以流的形式下载文件。 InputStream fis = new BufferedInputStream(new FileInputStream(file.getPath())); byte[] buffer = new byte[fis.available()]; fis.read(buffer); fis.close(); // 清空response response.reset(); OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); response.setContentType("application/octet-stream"); //如果输出的是中文名的文件,在此处就要用URLEncoder.encode方法进行处理 response.setHeader("Content-Disposition", "attachment;filename=" +URLEncoder.encode(file.getName(), "UTF-8")); toClient.write(buffer); toClient.flush(); toClient.close(); } catch (IOException ex) { ex.printStackTrace(); }finally{ try { File f = new File(file.getPath()); f.delete(); } catch (Exception e) { e.printStackTrace(); } } return response; }
文件压缩和下载zip包
//根据输入的文件与输出流对文件进行打包 public static void zipFile(File inputFile,ZipOutputStream ouputStream) { try { if(inputFile.exists()) { /**如果是目录的话这里是不采取操作的, * 至于目录的打包正在研究中*/ if (inputFile.isFile()) { FileInputStream IN = new FileInputStream(inputFile); BufferedInputStream bins = new BufferedInputStream(IN, 512); ZipEntry entry = new ZipEntry(inputFile.getName()); ouputStream.putNextEntry(entry); // 向压缩文件中输出数据 int nNumber; byte[] buffer = new byte[512]; while ((nNumber = bins.read(buffer)) != -1) { ouputStream.write(buffer, 0, nNumber); } // 关闭创建的流对象 bins.close(); IN.close(); } else { try { File[] files = inputFile.listFiles(); for (int i = 0; i < files.length; i++) { zipFile(files[i], ouputStream); } } catch (Exception e) { e.printStackTrace(); } } } } catch (Exception e) { e.printStackTrace(); } }
(5),清空临时文件夹
// 删除指定文件夹下所有文件 public static boolean delAllFile(String path) { boolean flag = false; File file = new File(path); if (!file.exists()) { return flag; } if (!file.isDirectory()) { return flag; } String[] tempList = file.list(); File temp = null; for (int i = 0; i < tempList.length; i++) { if (path.endsWith(File.separator)) { temp = new File(path + tempList[i]); } else { temp = new File(path + File.separator + tempList[i]); } if (temp.isFile()) { temp.delete(); } if (temp.isDirectory()) { delAllFile(path + "/" + tempList[i]);// 先删除文件夹里面的文件 //delFolder(path + "/" + tempList[i]);// 再删除空文件夹 flag = true; } } return flag; };
3,导入功能
(1),使用jQuery插件ajaxFileUpload上传文件。
<div class="show-ntitle">上传模板</div> <form style="display: none;"> <input class="uploadTemp" id="uploadTemp" type="file" name="files" class="inputstyle"> </form>
//上传模板 $("#uploadTemp").bind("change",function(){ console.info("开始上传"); $.ajaxFileUpload({ url : basePath + ‘temp/uploadTemp‘, secureuri : false, fileElementId : "uploadTemp", dataType : ‘text‘, success : function(data, status) { debugger var d = eval("(" + data + ")"); if(d.msg=="1"){ Util.message("导入成功","success"); window.location.reload(); }else if(d.msg=="3"){ Util.message("版本不匹配","error"); }else{ Util.message("上传失败","error"); }; }, error : function(data, status, e) { debugger Util.message("导入失败","error"); } }); });
(2),处理接受的文件。对资源文件,写入指定目录。对核心文件(temp.json),读取内容,创建模板对象,入库。
public static void unZip(String inputPath,String outputPath){ try { ZipInputStream Zin=new ZipInputStream(new FileInputStream(inputPath));//输入源zip路径 BufferedInputStream Bin=new BufferedInputStream(Zin); String Parent=outputPath; //输出路径(文件夹目录) File Fout=null; ZipEntry entry; try { while((entry = Zin.getNextEntry())!=null && !entry.isDirectory()){ Fout=new File(Parent,entry.getName()); if(!Fout.exists()){ (new File(Fout.getParent())).mkdirs(); } FileOutputStream out=new FileOutputStream(Fout); BufferedOutputStream Bout=new BufferedOutputStream(out); int b; while((b=Bin.read())!=-1){ Bout.write(b); } Bout.close(); out.close(); } Bin.close(); Zin.close(); } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); } // long endTime=System.currentTimeMillis(); }
文件解压
final static List<String> showAllFiles(File dir) throws Exception{ List<String> fileList = new ArrayList<String>(); File[] fs = dir.listFiles(); for(int i=0; i<fs.length; i++){ fileList.add(fs[i].getAbsolutePath()); //单层文件夹 无需递归算法 // if(fs[i].isDirectory()){ // try{ // showAllFiles(fs[i]); // }catch(Exception e){} // } } return fileList; }
递归遍历文件夹
//复制文件 public void copyFile(String oldPath, String newPath) { try { int bytesum = 0; int byteread = 0; File oldfile = new File(oldPath); if (oldfile.exists()) { //文件存在时 InputStream inStream = new FileInputStream(oldPath); //读入原文件 FileOutputStream fs = new FileOutputStream(newPath); byte[] buffer = new byte[1444]; int length; while ( (byteread = inStream.read(buffer)) != -1) { bytesum += byteread; //字节数 文件大小 fs.write(buffer, 0, byteread); } inStream.close(); } } catch (Exception e) { e.printStackTrace(); } }
复制文件
(3),处理导入过程中的各种异常。
时间: 2024-10-11 06:59:46