首页 > 代码库 > 基于ajaxFileUpload和Java IO的可视化项目模板导入导出功能

基于ajaxFileUpload和Java IO的可视化项目模板导入导出功能

目前部门在做的(大)数据可视化项目中增加了一个模板功能,经过一个星期的摸索,总算是打包提交测试通过了。这里记下一些技术要点,温故知新。

1,模板文件的格式设计

模板导出和导入的文件为一个“模板名称.zip”的压缩包。包内含有一个temp.json文件和若干资源文件(图片,视频,MP3音乐等)。

技术分享

temp.json文件格式:

技术分享
{    “content” : ”…”,     //模板内容    “thumbnail” : “…”,    //模板缩略图        “name” : “…”,        //模板名称    “resource” : “…”,    //资源路径    “version” : “3.x”    //版本}
View Code


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();      }
View Code

 

(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();            }
View Code

 

技术分享
    //遍历文件夹下所有文件    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 ;    }
View Code
技术分享
    //文件压缩    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();        }    }
View Code


(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;      };
View Code

 

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>
View Code
技术分享
//上传模板    $("#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");                    }                });    });
View Code

 

(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),处理导入过程中的各种异常。

 

基于ajaxFileUpload和Java IO的可视化项目模板导入导出功能