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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于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的可视化项目模板导入导出功能的主要内容,如果未能解决你的问题,请参考以下文章

springmvc_ajax异步上传文件(基于ajaxfileupload.js)

ajaxfileupload.js上传文件时后台用java怎么接收文件流

ajaxfileupload.js上传文件兼容IE7及以上版本

ajaxfileupload.js上传文件时后台用java怎么接收文件流

使用ajaxFileUpload这个控件上传文件,返回json数据出错?

基于jifnal框架的文件上传一般形式(img)