精华内容
下载资源
问答
  • 需求:单独下载:先将文章转为word后,与附件同时下载,下载后按照该文件的分类,创建相应的文件夹,(如果有多个顶级文件夹)最后将同类顶级文件夹共同存放一个根文件夹下,再压缩成一个压缩包下载 批量下载:...

    文件批量下载,根据文件类型名称及结构创建文件夹,最终转成压缩包以供下载

    需求:单独下载:先将文章转为word后,与附件同时下载,下载后按照该文件的分类,创建相应的文件夹,(如果有多个顶级文件夹)最后将同类顶级文件夹共同存放在一个根文件夹下,再压缩成一个压缩包下载
    批量下载:选中多个文件后,一键下载所有word文档与附件,所有的文件按照分类目录结构放置,最终下载一个压缩包

    一、分析

    实现上述需求,我们需要考虑一下几个必要的因素
    1、正文转成word文档
    2、创建和删除文件夹
    3、文件和文件夹的复制粘贴
    4、打压缩包
    5、java的下载方法
    6、路径!路径!路径!(很容易把自己绕晕)

    二、代码实现

    为了方便,也为了代码规范,先将正文转word文档、文件和文件夹的复制粘贴、删除文件夹等方法封装成util工具。话不多说上代码~~
    1、正文转word的方法

    package com.chixin.util;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;
    import org.apache.poi.xwpf.usermodel.XWPFRun;
    
    public class ToDocUtil {
    
    	//创建.doc后缀的word  
    	    public static void main(String[] args) {
    	        String path = "E:\\AAAAA";
    	        File file = new File(path);
    	        if (!file.exists()) {
    				file.mkdirs();
    			}
    	        String fileName = "哎呦不错哦.doc";
    	        File f = new File(path+"\\"+fileName);
    	        if (!f.exists()) {
    	        	 try {    
    	        	        f.createNewFile();    
    	        	    } catch (IOException e) {    
    	        	        // TODO Auto-generated catch block    
    	        	        e.printStackTrace();    
    	        	    }    
    
    			}
    	        //createWord(path,fileName);
    	        //writeDataDocx
    	        String data = "123";
    	        String filePath = path+"\\"+fileName;
    	        writeDataDocx(filePath,data,true,12);
    	    }
    	    public static void createWord(String path, String fileName) {
    	        //判断目录是否存在  
    	        File file = new File(path);
    	        //exists()测试此抽象路径名表示的文件或目录是否存在。
    	        //mkdir()创建此抽象路径名指定的目录。
    	        //mkdirs()创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。
    	        if (!file.exists()) file.mkdirs();
    	        //因为HWPFDocument并没有提供公共的构造方法 所以没有办法构造word  
    	        //这里使用word2007及以上的XWPFDocument来进行构造word  
    	        @SuppressWarnings("resource")
    	        XWPFDocument document = new XWPFDocument();
    	        OutputStream stream = null;
    	        try {
    	            stream = new FileOutputStream(new File(file, fileName));
    	            document.write(stream);
    	        } catch (FileNotFoundException e) {
    	            e.printStackTrace();
    	        } catch (IOException e) {
    	            e.printStackTrace();
    	        } finally {
    	            if (stream != null) ;
    	            try {
    	                stream.close();
    	            } catch (IOException e) {
    	                e.printStackTrace();
    	            }
    	        }
    	    }
    
    	    //向word中写入数据  
    
    	    /**
    	     * 有些方法需要传特殊类型的参数的时候,一般可以用★静态的接口.参数★来传参
    	     *
    	     * @param path
    	     * @param data
    	     */
    	    public static void writeDataDocx(String path, String data, boolean jiacu, int size) {
    	        InputStream istream = null;
    	        OutputStream ostream = null;
    	        try {
    	            istream = new FileInputStream(path);
    	            ostream = new FileOutputStream(path);
    	            @SuppressWarnings("resource")
    	            XWPFDocument document = new XWPFDocument();
    	            //添加一个段落 
    	            XWPFParagraph p1 = document.createParagraph();
    	            XWPFRun r1 = p1.createRun();//p1.createRun()将一个新运行追加到这一段
    
    	            r1.setText(data);
    
    	            r1.setBold(jiacu);//---"加黑加粗"
    	            r1.setFontSize(size);//---字体大小
    
    	            document.write(ostream);
    	            System.out.println("创建word成功");
    	        } catch (FileNotFoundException e) {
    	            e.printStackTrace();
    	        } catch (IOException e) {
    	            e.printStackTrace();
    	        } finally {
    	            if (istream != null) {
    	                try {
    	                    istream.close();
    	                } catch (IOException e) {
    	                    e.printStackTrace();
    	                }
    	            }
    	            if (ostream != null) {
    	                try {
    	                    ostream.close();
    	                } catch (IOException e) {
    	                    e.printStackTrace();
    	                }
    	            }
    	        }
    	    }
    
    	    //向word中写入数据
    //	    public static void writeDataDoc(String path,String data){
    //	        OutputStream ostream=null;
    //	        try {
    //	            ostream = new FileOutputStream(path);
    //	            ostream.write(data.getBytes());
    //	        } catch (FileNotFoundException e) {
    //	            e.printStackTrace();
    //	        } catch (IOException e) {
    //	            e.printStackTrace();
    //	        }finally{
    //	            if(ostream != null){
    //	                try {
    //	                    ostream.close();
    //	                } catch (IOException e) {
    //	                    e.printStackTrace();
    //	                }
    //	            }
    //	        }
    //	    }
    
    	    //读取数据 docx  
    	    public static String readDataDocx(String filePath) {
    	        String content = "";
    	        InputStream istream = null;
    	        try {
    	            istream = new FileInputStream(filePath);
    	            @SuppressWarnings("resource")
    	            XWPFDocument document = new XWPFDocument(istream);
    	            //getLastParagraph()返回包含页眉或页脚的文本的段落
    	            //getText()返回文档所有文本
    	            content = document.getLastParagraph().getText();//★★★★★
    	        } catch (FileNotFoundException e) {
    	            e.printStackTrace();
    	        } catch (IOException e) {
    	            e.printStackTrace();
    	        } finally {
    	            if (istream != null) {
    
    	            }
    	        }
    	        return content;
    	    }
    	
    
    }
    
    

    2、文件和文件夹的复制粘贴

    package com.chixin.util;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    
    
    public class copyFilesUtil {
    
    	/** 
    	* 复制单个文件 
    	* @param oldPath String 原文件路径 如:c:/fqf.txt 
    	* @param newPath String 复制后路径 如:f:/fqf.txt 
    	* @return boolean 
    	*/
    	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; //字节数 文件大小 
    					System.out.println(bytesum); 
    					fs.write(buffer, 0, byteread); 
    				} 
    				inStream.close(); 
    			} 
    		} 
    		catch (Exception e) { 
    			System.out.println("复制单个文件操作出错"); 
    			e.printStackTrace();
    		}
    	}
    	/** 
    	* 复制整个文件夹内容 
    	* @param oldPath String 原文件路径 如:c:/fqf 
    	* @param newPath String 复制后路径 如:f:/fqf/ff 
    	* @return boolean 
    	*/
    	public void copyFolder(String oldPath, String newPath) {
    		try { 
    			(new File(newPath)).mkdirs(); //如果文件夹不存在 则建立新文件夹 
    			File a=new File(oldPath); 
    			String[] file=a.list(); 
    			File temp=null; 
    			for (int i = 0; i < file.length; i++) { 
    				if(oldPath.endsWith(File.separator)){ 
    					temp=new File(oldPath+file[i]); 
    				} 
    				else{ 
    					temp=new File(oldPath+File.separator+file[i]); 
    				}
    				if(temp.isFile()){ 
    				FileInputStream input = new FileInputStream(temp); 
    				FileOutputStream output = new FileOutputStream(newPath + "/" + 
    						(temp.getName()).toString()); 
    				byte[] b = new byte[1024 * 5]; 
    				int len; 
    				while ( (len = input.read(b)) != -1) { 
    					output.write(b, 0, len); 
    				} 
    				output.flush(); 
    				output.close(); 
    				input.close(); 
    				} 
    				if(temp.isDirectory()){//如果是子文件夹 
    					copyFolder(oldPath+"/"+file[i],newPath+"/"+file[i]); 
    				} 
    			} 
    	} 
    		catch (Exception e) { 
    			System.out.println("复制整个文件夹内容操作出错"); 
    			e.printStackTrace();
    		}
    	}
    	public static void main(String[] args)throws Exception {
    	// //这是你的源文件,本身是存在的
    	// File beforefile = new File("C:/Users/Administrator/Desktop/Untitled-2.html");
    	//
    	// //这是你要保存之后的文件,是自定义的,本身不存在
    	// File afterfile = new File("C:/Users/Administrator/Desktop/jiekou0/Untitled-2.html");
    	//
    	// //定义文件输入流,用来读取beforefile文件
    	// FileInputStream fis = new FileInputStream(beforefile);
    	//
    	// //定义文件输出流,用来把信息写入afterfile文件中
    	// FileOutputStream fos = new FileOutputStream(afterfile);
    	//
    	// //文件缓存区
    	// byte[] b = new byte[1024];
    	// //将文件流信息读取文件缓存区,如果读取结果不为-1就代表文件没有读取完毕,反之已经读取完毕
    	// while(fis.read(b)!=-1){
    	// //将缓存区中的内容写到afterfile文件中
    	// fos.write(b);
    	// fos.flush();
    	// }
    	String oldPath="E:\\厨房电器\\";
    	String newPath="E:\\chixinDownload\\厨房电器2";
    	copyFilesUtil t=new copyFilesUtil();
    	t.copyFolder(oldPath, newPath);
    	}
    }
    
    

    3、删除文件夹

    package com.chixin.util;
    
    import java.io.File;
    
    public class FileDleteUtil {
    	public static void main(String[] args) {
    		FileDleteUtil fdu = new FileDleteUtil();
    		fdu.deleteDir("E:\\123");
    	}
    
    	public static boolean deleteDir(String dirPath){
    		File file = new File(dirPath);
    		if(file.isFile()){
    			file.delete();
    			return true;
    		}else{
    			File[] files = file.listFiles();
    			if(files == null){
    				file.delete();
    				return true;
    			}else{
    				for (int i = 0; i < files.length; i++){
    					boolean deleteDir = deleteDir(files[i].getAbsolutePath());
    				}
    				file.delete();
    				return true;
    			}
    		}
    	}
    }
    
    

    4、打压缩包

    package com.chixin.util;
    
    import java.io.*;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;
    
    public class ZipUtils {
        private static final int  BUFFER_SIZE = 2 * 1024;
    
        /**
         * 压缩成ZIP 方法     * @param srcDir 压缩文件夹路径
         * @param out    压缩文件输出流
         * @param KeepDirStructure  是否保留原来的目录结构,true:保留目录结构;
         *                          false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
         * @throws RuntimeException 压缩失败会抛出运行时异常
         */
        public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure)
                throws RuntimeException{
    
            long start = System.currentTimeMillis();
            ZipOutputStream zos = null ;
            try {
                zos = new ZipOutputStream(out);
                File sourceFile = new File(srcDir);
                compress(sourceFile,zos,sourceFile.getName(),KeepDirStructure);
                long end = System.currentTimeMillis();
                System.out.println("压缩完成,耗时:" + (end - start) +" ms");
            } catch (Exception e) {
                throw new RuntimeException("zip error from ZipUtils",e);
            }finally{
                if(zos != null){
                    try {
                        zos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
    
        }
    
        /**
         * 压缩成ZIP 方法     * @param srcFiles 需要压缩的文件列表
         * @param out           压缩文件输出流
         * @throws RuntimeException 压缩失败会抛出运行时异常
         */
        public static void toZip(List<File> srcFiles , OutputStream out)throws RuntimeException {
            long start = System.currentTimeMillis();
            ZipOutputStream zos = null ;
            try {
                zos = new ZipOutputStream(out);
                for (File srcFile : srcFiles) {
                    byte[] buf = new byte[BUFFER_SIZE];
                    zos.putNextEntry(new ZipEntry(srcFile.getName()));
                    int len;
                    FileInputStream in = new FileInputStream(srcFile);
                    while ((len = in.read(buf)) != -1){
                        zos.write(buf, 0, len);
                    }
                    zos.closeEntry();
                    in.close();
                }
                long end = System.currentTimeMillis();
                System.out.println("压缩完成,耗时:" + (end - start) +" ms");
            } catch (Exception e) {
                throw new RuntimeException("zip error from ZipUtils",e);
            }finally{
                if(zos != null){
                    try {
                        zos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
    
        /**
         * 递归压缩方法
         * @param sourceFile 源文件
         * @param zos        zip输出流
         * @param name       压缩后的名称
         * @param KeepDirStructure  是否保留原来的目录结构,true:保留目录结构;
         *                          false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
         * @throws Exception
         */
        private static void compress(File sourceFile, ZipOutputStream zos, String name,
                                     boolean KeepDirStructure) throws Exception{
            byte[] buf = new byte[BUFFER_SIZE];
            if(sourceFile.isFile()){
                // 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字
                zos.putNextEntry(new ZipEntry(name));
                // copy文件到zip输出流中
                int len;
                FileInputStream in = new FileInputStream(sourceFile);
                while ((len = in.read(buf)) != -1){
                    zos.write(buf, 0, len);
                }
                // Complete the entry
                zos.closeEntry();
                in.close();
            } else {
                //是文件夹
                File[] listFiles = sourceFile.listFiles();
                if(listFiles == null || listFiles.length == 0){
                    // 需要保留原来的文件结构时,需要对空文件夹进行处理
                    if(KeepDirStructure){
                        // 空文件夹的处理
                        zos.putNextEntry(new ZipEntry(name + "/"));
                        // 没有文件,不需要文件的copy
                        zos.closeEntry();
                    }
    
                }else {
                    for (File file : listFiles) {
                        // 判断是否需要保留原来的文件结构
                        if (KeepDirStructure) {
                            // 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,
                            // 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了
                            compress(file, zos, name + "/" + file.getName(),KeepDirStructure);
                        } else {
                            compress(file, zos, file.getName(),KeepDirStructure);
                        }
    
                    }
                }
            }
        }
    
        public static void main(String[] args) throws Exception {
            /** 测试压缩方法 */
            FileOutputStream fos1= new FileOutputStream(new File("E:/testZip123.zip"));
            ZipUtils.toZip("E:/2", fos1,true);
    
            /** 测试压缩方法 */
    //        List<File> fileList = new ArrayList<>();
    //        fileList.add(new File("D:/Java/jdk1.7.0_45_64bit/bin/jar.exe"));
    //        fileList.add(new File("D:/Java/jdk1.7.0_45_64bit/bin/java.exe"));
    //        FileOutputStream fos2= new FileOutputStream(new File("c:/mytest02.zip"));
    //        ZipUtils.toZip(fileList, fos2);
        }
    }
    

    上述四个工具类,直接复制到自己的项目中改个包名即可,里面均附有main()方法,可测试完再去调用。

    5、下载

    我们的目的是下载一个压缩包,那么从后往前推:
    最终下载的压缩包–>最终下载的文件夹–>父文件夹–>子文件夹–>doc文档+附件
    捋清楚层级关系后,我们需要一个文章的id来查询正文,需要一个附件的path(路径)来进行附件下载,或者叫复制附件。当然,这是针对单独操作时需要的,那么,如果需要批量下载,怎么办呢,其实也很简单,将我们需要的id和path,用逗号隔开传过来即可。详细过程请看代码:

    	/**
    	* 文件(二进制数据)下载
    	* @param paths 文件路径 多个path之间用逗号隔开
    	* @param ids 文章id 多个id之间用逗号隔开
    	* ResponseEntity<byte[]>
    	* @return
    	 * @throws FileNotFoundException 
    	*/
    	@ResponseBody
    	@RequestMapping(value = "/downloadFile" , method = RequestMethod.GET)
    	public ResponseEntity<byte[]> downloadFile(String ids,String paths,HttpServletRequest request) throws FileNotFoundException{
    		//文件将保存在contentpath路径之下
    		paths = "E:\\123.png,E:\\456.png";
    		String num = UUID.randomUUID().toString().replace("-", "");
    		String contentpath = ContentUtil.DOWNLOAD_URL+num.substring(0,10);
    		File fil = new File(contentpath);
    		if (!fil.exists()) {
    			fil.mkdirs();
    		}
    		System.out.println("最终下载的文件夹已创建成功");
    		//遍历ids
    		String str[] = ids.split(",");
    		String affix[] = paths.split(",");
    		for (int i = 0; i < str.length; i++) {
    			String uuid = UUID.randomUUID().toString().replace("-", "");
    			String url = ContentUtil.DOWNLOAD_URL+uuid.substring(11, 16);
    			File fi = new File(url);
    	        if (!fi.exists()) {
    				fi.mkdirs();
    			}
    	        System.out.println("最终下载的文件夹已创建成功");
    //			path = "E:\\123.png";
    			KnowledgeContent bean = service.findById(str[i]);
    			copyFilesUtil copyutil = new copyFilesUtil();
    		    String title = bean.getTitle();
    		    String fileName = title + uuid.substring(0, 6)+".doc";
    		    
    			//根据id查询正文
    
    			String data = bean.getMycontent();
    			ToDocUtil toDocUtil = new ToDocUtil();
    			String foo = "";
    			//根据文件类型创建文件夹放置转好的word文件
    			KnowledgeContentType tbean = typeservice.findById(bean.getMytype());
    			String rd = uuid.substring(6,10);
    			
    			if (!"0".equals(tbean.getSuperid())) {
    				//如果该文件的分类有父级分类,先用子集的名称创建一个文件夹
    				String childfolder = url+"\\"+tbean.getName();
    				File fold = new File(childfolder);
    				fold.mkdirs();
    				System.out.println("子文件夹创建成功");
    		        //创建一个新的文件名称用来存放正文
    		        File f = new File(childfolder+"\\"+fileName);
    		        if (!f.exists()) {
    		        	 try {    
    		        	        f.createNewFile();   
    		        	        
    		        	    } catch (IOException e) {    
    		        	        // TODO Auto-generated catch block    
    		        	        e.printStackTrace();    
    		        	    }   
    				}
    		        //createWord(path,fileName);
    		        //writeDataDocx
    		        String filePath = childfolder+"\\"+fileName;
    		        //将正文写入一个word文档中
    		        toDocUtil.writeDataDocx(filePath,data,true,12);
    		        System.out.println("新的word文件创建成功");  
    		        //将新生成的word文件复制到子文件夹下
    		        //copyutil.copyFile(filePath, "E:\\"+tbean.getName()+"\\"fileName);
    		        //将需要下载的附件从path复制在子目录路径之下
    		        copyutil.copyFile(affix[i], childfolder+"\\"+affix[i].substring(affix[i].lastIndexOf("\\")+1));
    		        System.out.println("附件已经成功复制到指定目录");
    				//在用父类的名称创建一个文件夹,将子集的文件夹复制到新的文件夹中去
    		        String supername = typeservice.findById(tbean.getSuperid()).getName();
    		        System.out.println("supername:"+supername);
    				foo = rd +"-"+ supername ;
    				File folds = new File(url+"\\"+foo);
    				folds.mkdirs();
    				System.out.println("父文件夹创建成功");
    				copyutil.copyFolder(childfolder, url+"\\"+foo+"\\"+tbean.getName());
    				System.out.println("成功将子文件夹复制到父文件夹中了");
    				//再将父文件夹复制到contentpath路径之下
    				copyutil.copyFolder(url+"\\"+foo, contentpath+"\\"+foo);
    				System.out.println("成功所有文件复制到contentpath路径下");
    			}else {
    				foo = rd +"-"+ tbean.getName();
    				File fold = new File(url+"\\"+foo);
    				fold.mkdirs();
    				System.out.println("单层文件夹创建成功");
    		        //创建一个新的文件名称用来存放正文
    		        File f = new File(url+"\\"+foo+"\\"+fileName);
    		        if (!f.exists()) {
    		        	 try {    
    		        	        f.createNewFile();    
    		        	    } catch (IOException e) {    
    		        	        // TODO Auto-generated catch block    
    		        	        e.printStackTrace();    
    		        	    }   
    				}
    		        //createWord(path,fileName);
    		        //writeDataDocx
    		        String filePath = url+"\\"+foo+"\\"+fileName;
    		        //将正文写入一个word文档中
    		        toDocUtil.writeDataDocx(filePath,data,true,12);
    		        System.out.println("新的word文件创建成功");   
    		        //将需要下载的附件从path复制在子集文件夹之下
    		        copyutil.copyFile(affix[i], url+"\\"+foo+"\\"+affix[i].substring(affix[i].lastIndexOf("\\")+1));
    		        System.out.println("word文件已经成功复制到指定目录"); 
    		        //将父文件夹复制到contentpath路径之下
    				copyutil.copyFolder(url+"\\"+foo, contentpath+"\\"+foo);
    			}
    		}
    
    		
            //将contentpath文件夹压缩成zip
            ZipUtils ziputil = new ZipUtils();
            String newpath = contentpath+".zip";
            FileOutputStream fos1= new FileOutputStream(new File(newpath));
            ziputil.toZip(contentpath, fos1, true);
            System.out.println("最终下载的文件夹已成功打成zip压缩包");	
    		HttpHeaders headers = new HttpHeaders();
    		ResponseEntity<byte[]> entity = null;
    		InputStream in=null;
    	try {		
    		in=new FileInputStream(new File(newpath));
    	
    		byte[] bytes = new byte[in.available()];
    	 // path是指欲下载的文件的路径。
        	File file = new File(newpath);
        // 取得文件名。
        	String filename = file.getName();
        	System.out.println("filename:"+filename);
     
        // 截取文件名。
    //    String imageName = filename.substring(filename.lastIndexOf("/")+1).toUpperCase();
    //	System.out.println("imageName:"+imageName);
    	
    	//处理IE下载文件的中文名称乱码的问题
    		String header = request.getHeader("User-Agent").toUpperCase();
    	if (header.contains("MSIE") || header.contains("TRIDENT") || header.contains("EDGE")) {
    		filename = URLEncoder.encode(filename, "utf-8");
    		filename = filename.replace("+", "%20"); //IE下载文件名空格变+号问题
    	} else {
    		filename = new String(filename.getBytes(), "iso-8859-1");
    	}
    	
    		in.read(bytes);
    	
    		headers.add("Content-Disposition", "attachment;filename="+filename);
    	
    		entity = new ResponseEntity<byte[]>(bytes, headers, HttpStatus.OK);
    	
    	} catch (Exception e) {
    		e.printStackTrace();
    	}finally {
    		if(in!=null) {
    			try {
    				in.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    	
    	return entity;
    	
    }
    	
    	/*
    	 * 删除容器中指定路径下的文件夹
    	 */
    	@RequestMapping(value = "/filedelete" , method = RequestMethod.GET)
    	public Map<String,Object> filedelete(){
    		FileDleteUtil fdu = new FileDleteUtil();
    		fdu.deleteDir(ContentUtil.DOWNLOAD_URL.substring(0, ContentUtil.DOWNLOAD_URL.lastIndexOf("\\")));
    	
    		return OutgoingUtils.OutgoingParameter("200", "删除成功");
    	}
    

    以上方法用到很多流的东西,需要import的包很多,这些是本人使用过程中用到的一些包,供大家参考:

    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URLEncoder;
    import java.util.Date;
    import java.util.List;
    import java.util.Map;
    import java.util.UUID;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.CrossOrigin;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.multipart.MultipartFile;
    

    还有需要注意的一个坑,就是缺少jar包的问题~
    有三个不太引人注意但还必不可少的jar包如下:
    commons-math3-3.6.1.jar
    commons-collections4-4.1.jar
    commons-compress-1.20.jar
    都可去官网免费下载http://commons.apache.org/proper/commons-compress/download_compress.cgi
    希望对新猿们有所帮助!

    展开全文
  • 右击很多文件夹,添加到压缩文件,然后文件中勾选把每个文件放到单独的压缩文件中即可  

    右击很多文件夹,添加到压缩文件,然后在文件中勾选把每个文件放到单独的压缩文件中即可

     

    展开全文
  • 把多个文件夹压缩同一个压缩包 tar -zcvf test.tar.gz test1 test2 或者: for i in `find ./* -type d`;do zip $i.zip ./$i/*;done 'find ./* -type d' 表示查找所有文件夹,-type d就表示指定文件夹类型,...

    把多个文件夹压缩在同一个压缩包 

    tar -zcvf  test.tar.gz test1 test2   

     或者:

    for i in `find ./* -type d`;do zip $i.zip ./$i/*;done

    'find ./* -type d' 表示查找所有文件夹,-type d就表示指定文件夹类型,这种方法是把每个文件夹单独压缩,一个文件夹对应一个压缩包

    展开全文
  • APK文件夹结构

    万次阅读 2011-12-11 22:42:07
    apk文件,即Android application package文件。 每个要安装到Android平台的应用都要被编译打包...Android 系统安装时,APK 程序会被存放系统默认的APP 目录中。 既然是一个Zip压缩包,那我们就不妨先解压出来看看
    
    

    apk文件,即Android application package文件。

    每个要安装到Android平台的应用都要被编译打包为一个单独的文件,后缀名为.apk,其中包含了应用的二进制代码、资源、配置文件等。APK文件其实是zip格式,但后缀名被修改为apk, 
    在Android 系统安装时,APK 程序会被存放在系统默认的APP 目录中。

    既然是一个Zip压缩包,那我们就不妨先解压出来看看其目录结构和内容,在我这我以NDK中的two-libs为例,以NDK为例,主要是要在本文中介绍SDK和NDK结合打包的方法。先看图:

    2

     

    其实这个目录结构与源代码的目录结构类似,接下来我们对比看看源代码(我用的是eclipse):

    1

    看见没有,几乎就是一样的!接下来挨个介绍下apk中个文件及目录的内容和作用吧,一下资料来源于网络和官方文档当然还有个人理解。

    • AndroidManifest.xml

      该文件是每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等等信息[ , ],如要把apk上传到Google Market上,也要对这个xml做一些配置。在apk中的AndroidManifest.xml是经过压缩的,可以通过AXMLPrinter2工具 [ , ]解开,具体命令为:java -jar AXMLPrinter2.jar AndroidManifest.xml

    • META-INF目录 
      META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全。在eclipse编译生成一个apk包时,会对所有要打包的文件做一个 校验计算,并把计算结果放在META-INF目录下。这就保证了apk包里的文件不能被随意替换。比如拿到一个apk包后,如果想要替换里面的一幅图片, 一段代码, 或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有助于保护系统的安全。
    • res目录 
            res目录存放资源文件。包括图片,字符串等等。
    • lib目录

      lib目录下的子目录armeabi存放的是一些so文件。这个地方多讲几句,都是在开发过程中摸索出来的。eclipse在打包的时候会根据文件名的命 名规则(lib****.so)去打包so文件,开头和结尾必须分别为“lib”和“.so”,否则是不会打包到apk文件中的。其他非eclipse开 发环境没有测试过。如果你是用SDK和NDK开发的话,这部分很重要,甚至可以通过把一些不是so文件的文件通过改名打包到apk中,具体能干些什么那就 看你想干什么了,呵呵呵!

    • assets目录

      assets目录可以存放一些配置文件,这些文件的内容在程序运行过程中可以通过相关的API获得。具体的方法可以参考SDK中的例子:在sdk的 \SDK\1.6\android-sdk-windows-1.6_r1\platforms\android-1.6\samples\ApiDemos 例子中,有个com.example..android.apis.content 的例子,在这个例子中他把一个text文件放到工程的asset目录下,然后把这个txt当作普通文件处理。处理的过程在ReadAsset.java 中。同理,asset也可以放置其他文件。

    • classes.dex文件 
            classes.dex是java源码编译后生成的java字节码文件(首先是java文件通过jdk编译成字节码文件然后经过dex编译成classes.dex)。但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容 的,dex文件与class文件相比,不论是文件结构还是opcode都不一样。目前常见的java反编译工具都不能处理dex文件。Android模拟 器中提供了一个dex文件的反编译工具,dexdump。用法为首先启动Android模拟器,把要查看的dex文件用adb push上传的模拟器中,然后通过adb shell登录,找到要查看的dex文件,执行dexdump xxx.dex。另,有人介绍到Dedexer是目前在网上能找到的唯一一个反编译dex文件的开源工具,需要自己编译源代码。
    • resources.arsc 
            编译后的二进制资源文件的索引(apk文件的资源表(索引))
    上面这些资源最后通过aapt这个工具打包成apk,其实当生成apk的时候就会调用这个命令
    展开全文
  • 批量单独打包文件

    2018-03-16 18:11:00
    要一次打包很多个文件,每个文件都单独一个压缩包,压缩的时候选择 压缩每个文件到单独压缩包就可以了,解压时,当选中多个压缩包的时候,右键解压也会出现,解压每个包到单独文件夹的选项 转载于:...
  • 转 效果图: 原来的一坨文件 现在的一个单独的EXE文件,看起来就很吊的样子 ...将所有的文件打包成一个RAR压缩包,没错,直接打成...1、在压缩包上双击,选“自解压格式” 2、配置选项 选中第一个模块,然...
  • 创建了一个线程,线程里面用URLDownloadToFile从服务器上下载了一个zip的资源包, 下载完成后,需要解压该文件,替换文件夹下的其他文件。不知为何无法正常解压,而解压算法单独测试时,可以正常解压! 使用的这个...
  • 这是一个可以将邮件合并操作的模板分割成单独文件批量保存的word插件。 使用方法: 1. 加压splitMailMerge.rar 压缩包,运行压缩包里的 "注册控件.bat" 文件。 2. 模板文档同目录下简历名称为 “分开” 的文件夹...
  •  tomcat压缩包加压后,启动lib文件夹下面的startup.bat,浏览器中输入http://localhost:8080/后出现Tomcat的界面。  但是eclipse中,jsp可以正常运行,然而浏览器中输入http://localhost:8080/后,出现404...
  • 把NDK压缩包解压到系统,如/mnt目录下,后/mnt目录下建立文件夹my_ndk_toolchain,然后再/mnt目录下执行以下命令:/mnt/android-ndk-r9c/build/tools/make-standalone-toolchain.sh --platform=android-19 --...
  • Linux

    2019-12-19 21:14:46
    root:root用户单独文件夹 usr:所有用户安装的软件都放入到这个文件夹中(usr/local下新建一个temp文件夹,所有压缩包都放在这个里面) 常用命令:() pwd:打印工作目录,就是当前所在目录 cd:进入到文件夹 ...
  • 一、linux入门笔记

    2018-11-18 01:21:31
    root 用户 root 单独文件夹 usr 所有用户安装的软件都放入到这个文件夹中 usr/local下新建一个tmp,所有压缩包都上传到tmp中   二、jdk配置环境变量: vim /etc/profile export JAVA_HO...
  • 压缩包解压到一个单独文件夹中。 查找X:\(凯立德所在文件夹)\NaviResFile\StartUpRes.dll. 将这个DLL文件复制到刚才解压的文件夹中,与BMP2KLD.exe同一目录下。 启动BMP2KLD.exe,点击“分解KLD StartUpRes”...
  • idea 2019.3,jdk8源码包一、解压源码压缩包从jdk安装目录中找到 src.zip 的源码压缩包,解压后得到源码文件夹二、创建Java项目因主要目的是调试源码,了解其功能的实现过程,所以IDEA中创建一个java项目(单独的一...
  • 1、单独取压缩包中的Thinkphp文件夹 ...2、在单独的项目内创建一个引入文件 3、通过浏览器访问该index.php 会创建相应的目录 转载于:https://www.cnblogs.com/8000cabbage/p/6253792.html...
  • 为maven建立一个单独文件夹,可以建立其他盘,由于我就一个盘,所以就建了C盘 需要maven的文件夹单独建一个存储本地仓库的文件夹 三、配置环境变量 测试: 四、IDEA中更改设置 五、...
  • 如何用 WinRAR 批量解压文件?

    千次阅读 2011-09-07 10:27:21
    选择所要解压的压缩包选中的文件上单击右键选择"解压每个文件到单独文件夹"就可以了!
  • 本程序非常小巧,可以单独使用,也可以加自己的网站里,当一个小插件使用 本代码可以自动更新最新新闻咨询,更新的新闻不占系统资源,并且显示新闻的连接是自己的站点连接而不是显示外链。 所以可以有效的丰富...
  • (2)解压完有imagenet2015文件夹,这个文件夹里是imagenet_object_detection_video_train.tar.gz这个压缩包 (3)再接着将上述压缩包解压成了imagenet_object_detection_video_train.tar这个压缩包 (4)之后最好...
  • 为什么要写一个lib,把jar包单独存放那个文件夹里面?答:因为这样就可以项目下找到了 。我们以mysql为例,add to path 的时候只能导入以.jar结尾的文件,而不能是压缩包。导入后就有library这样的外部jar了。...
  • 03_资源压缩打包

    2020-03-29 16:33:49
    资源压缩打包 现在市面上有很多基于 DuiLib 开发的程序,又或者是从 DuiLib ...有的使用的就是执行程序目录下的文件夹,而有的使用的是一个压缩包(有可能加密),还有的就是一个单独的执行文件复制到任意位置运行同...
  • 1.CAD工具箱安装步骤1.1解压软件包下载CAD工具箱压缩包后,解压后将整个文件夹储存到指定目录,请注意不要单独拷贝压缩包中的内容使用,需拷贝整个文件夹,避免插件报错,丢失相关组件。1.2加载软件启动AutoCAD,...
  • 使用GitHub上的模型 ... 本案例要使用slim文件夹中的train_image_classifier.py(可以将slim文件夹单独copy出来) 下载并制作自己的数据集放到创建的H:\Self-Study\PyCharm\test\slim\i...
  • 这个工具可以将一个指定的包文件(类似压缩包那样包含了很多文件或文件夹在里面的文件)中的内容释放到新文件夹中,也可以逆向将一个文件夹中的内容重新打包为一个单独的文件。本工具是 qq2009 (sp3及更新)、qq影音 ...
  • ubuntu Install Firefox

    2017-02-28 10:17:00
    不想删除当前安装的 Firefox,给每个版本的 Firefox 创建一个单独文件夹。 例如:1.Firefox 版本30,使用下面的命令/opt目录下创建一个包含新 Firefox 内容的文件夹。sudo mv firefox/ /opt/firefox30 # /opt/...
  • 手动安装Firefox Linux

    2017-02-28 09:10:00
    (2015-06-05 17:22:19)[编辑]...不想删除当前安装的 Firefox,给每个版本的 Firefox 创建一个单独文件夹。 例如:1.Firefox 版本30,使用下面的命令/opt目录下创建一个包含新 Firefox 内容的文件夹。sudo mv f...
  • 这个软件可以将你用浏览器观看视频时所缓存的视频文件缓存文件夹里面提取出来,对于一些不会下载视频或者说不想安装各种客户端、不想注册各种网站的人来说,此程序绝对是一把利器! ps:压缩包里的主程序可以...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 134
精华内容 53
关键字:

压缩包在单独文件夹