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

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

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

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

Eclipse调试程序及项目的导入导出

Eclipse调试程序 调试概述: ①   调试就是测试程序的方法,主要的目的就是解决程序的逻辑问题,流程是:发现问题.修改问题.正确执行; ②   以前我们可以使用System.out.println()方法来查看我们程序中的问题; ③   现在我们可以使用Eclipse开发工具帮我们进行调试: Eclipse为程序员提供了设置断点的功能来达到单步调试程序的能力; 调试步骤: ①   初步判断程序出错的位置; ②   给指定的程序设置断点(可以设置多个); ③   进入调试视图让程序在断点位置

Java中的项目的导入导出

在很多情况下,需要把当前的Java工程传递给其他人继续工作或者协同工作,或者从其他人那里接收到传递来的Java项目,这时掌握Java项目的导入和导出是十分必要的. Hello World->右键->Export...->General->Archive(压缩文件)->next 勾选Hello World 右侧的两个是关于工程的.classpath配置文件和当前的工程配置文件(.project) 如果希望该工程导出之后可以被其他人导入并且继续使用开发 .classpath和.p

Insurance 项目——excel导入导出数据库

这是一个java初学者在独立开发一个项目时做的笔记,很多内容仅仅是为了解决当前需求,并未很深入的研究. 项目中需要excel与数据库之间的导入和导出功能,还需要对列名进行一些匹配. jar包 pom.xml 1 <!-- exceljar包 --> 2 <dependency> 3 <groupId>net.sourceforge.jexcelapi</groupId> 4 <artifactId>jxl</artifactId> 5

新知识:Java 利用itext填写pdf模板并导出(昨天奋战到深夜四点,知道今天两点终于弄懂)

废话少说,不懂itext干啥用的直接去百度吧. ***************制作模板******************* 1.先用word做出界面 2.再转换成pdf格式 3.用Adobe Acrobat 打开你刚刚用word转换成的pdf 会出现如下界面 下一步 点击浏览,选择刚才你转换好的pdf 下一步 4.打开后它会自动侦测并命名表单域,右键表单域,点击属性,出现文本域属性对话框,有的人说要改成中文字体,可是我没有改一样成功啦 5.一般情况下不需要修改什么东西,至少我没有修改哦 6.直

项目中导入导出两个关联的库

1.用system账号登陆 创建两个数据库并赋予权限1)wlmqpb数据库 密码 lxx详细情况见:http://www.cnblogs.com/xinxin1994/p/5257472.html2)sjzx数据库 密码lxx详细情况见:http://www.cnblogs.com/xinxin1994/p/5257472.html2.(1)把导出来的wlmqpbjg.sql(表结构.函数.存储过程等)用ImportTables导入 (2)把导出来的wlmqpb.sql文件(表数据)用Impor

java.io.Serializable

Java API中java.io.Serializable接口源码: 1 public interface Serializable { 2 } 类通过实现java.io.Serializable接口可以启用其序列化功能.未实现次接口的类无法使其任何状态序列化或反序列化.可序列化类的所有子类型本身都是可序列化的.序列化接口没有方法或字段,仅用于标识可序列化的语义. Java的"对象序列化"能让你将一个实现了Serializable接口的对象转换成byte流,这样日后要用这个对象时候,你

从Java IO到JDK的使用

入职一个月了,所在岗位并没有使用原来熟悉的C/C++语言,一边工作一边学习Java.最近由于项目要求,经常使用Java中的读写操作,对此有些心得体会在此整理成文,文中主要的思路:首先介绍IO基本功能,然后介绍怎么根据功能需要,选择具体的IO操作. 一.Java IO常用的类图及其基本功能: 查看Java JDK可以发现IO包中包含了以下8个基类: (图片来源:http://www.falkhausen.de/Java-8/java.io/index.html) 图1 Java.IO包结构 其中:

java.io 包

java.io 通过数据流.序列化和文件系统提供系统输入和输出. 请参见: 接口摘要 Closeable Closeable 是可以关闭的数据源或目标. DataInput DataInput 接口用于从二进制流中读取字节,并根据所有 Java 基本类型数据进行重构. DataOutput DataOutput 接口用于将数据从任意 Java 基本类型转换为一系列字节,并将这些字节写入二进制流. Externalizable Externalizable 实例类的唯一特性是可以被写入序列化流中,

基于Mapxtreme for JAVA的电子地图设计与实现

基于Mapxtreme for JAVA的电子地图设计与实现学生毕业设计,适合测绘类专业研究目标:        开发一个基于MapXtreme for JAVA的校园电子地图项目,使用MapInfo来绘制地图使用户能够实时的了解华南理工大学广州学院校园及周边的地理信息. 研究内容:      校园电子地图系统共分为4个功能模块来实现:      1.地图放大.缩小及漫游的功能模块:为了能够清晰的查看地图的某一角落的详细信息,了解学校的地理位置以及学校的地理规划.用户可以在电子地图上对感兴趣的地