zoukankan      html  css  js  c++  java
  • 下载和上传(其实就是复制粘贴)

    下载:

    /*
     * 说白了其实导出就是复制粘贴(从存储在云上的文件复制到用户的本地硬盘上):                      
     * 先取得路径,然后根据路径来复制 BufferedInputStream 是为了更高效的复制,read()方法是具体的复制行为      
     * 把流写出中,write()就是具体的粘贴行为                                              
     */
    public class HaHa {
        
        // 下载excel 模板
        public Response downLoadExcelModel(HttpServletResponse response,HttpServletRequest request) {
    
            BufferedInputStream bufferedInputStream;
            FileInputStream fileInputStream;
            OutputStream outputStream;
            
            try {
                String modelName = request.getParameter("modelName");
                String modelName1 = java.net.URLEncoder.encode(modelName, "UTF-8").replaceAll("%28", "\(").replaceAll("%29", "\)");// 转义符
                String pathName = "excel/" + modelName + ".xlsx";
                // path 输出值为:E:20171128esim-80002795esim-serviceesimesim-websrcmainwebappexcel险种组合管理表.xlsx 记住,这个方法一般都是在src.main.webapp下面的
                String path = request.getSession().getServletContext().getRealPath(pathName);
                File file = new File(path);
                fileInputStream = new FileInputStream(file);// 如果该路径下面没有该文件,则报 “系统找不到指定路径” 的错误
                bufferedInputStream = new BufferedInputStream(fileInputStream);// 记住,BufferedInputStream构造方法的参数一般都是FileInputStream对象
                byte[] b = new byte[bufferedInputStream.available()];
                bufferedInputStream.read(b);// 以为是excel模板的,文件很小,所以可以一次性读出,如果不是excel模板文件很小,就不能了,因为可能内存溢出
                /*
                 * 利用response得到输出流outputStream
                 * 再一次性把这输出流写出
                 */
                response.setContentType("application/vnd.ms-excel");//contentType里面的内容要对应excel格式的啊
                response.setHeader("Content-disposition", "attachment;filename=" + modelName1 + ".xlsx");//modelName1一定要是那种编码之后的格式
                outputStream = response.getOutputStream();
                outputStream.write(b);
            } catch (UnsupportedEncodingException e) {
                logger.error("下载模版文件名转换异常" + e);
            } catch (FileNotFoundException e) {
                logger.error("下载模版文件没有找到对应的模版名异常" + e);
            } catch (IOException e) {
                logger.error("下载模版文件名IO异常" + e);
            } finally {
                bufferedInputStream.close();
                fileInputStream.close();// 我记得这个是不用关的
                outputStream.flush();
                outputStream.close();
            }
    
        }
        
        /* 下载 wmv 或者 MP4  文件
         * 因为mp4或者wmv的文件比较大,所以最好不要用availalbe方法啊
         */
        public Response downLoadSystemVideo(HttpServletResponse response,HttpServletRequest request,String modelName){
            String  pathName="video/"+modelName;
            String[] split = modelName.split("\.");//转义符,实际上是对   . 进行 split;因为要下载的文件后缀有wmv 以及 mp4 嘛
            String path=request.getSession().getServletContext().getRealPath(pathName);
            File file = new File(path);
            try(
                FileInputStream fileInputStream = new FileInputStream(file);
                BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);) {
                if("wmv".equals(split[split.length - 1])) {
                    response.setContentType("wmv video/x-ms-wmv");//contentType里面的内容要对应wmv格式的啊
                    String modelName1 = java.net.URLEncoder.encode(modelName, "UTF-8").replaceAll("%28", "\(").replaceAll("%29", "\)"); 
                    response.setHeader("Content-disposition", "attachment;filename="+modelName1);                
                }else if("mp4".equals(split[split.length - 1])) {
                    response.setContentType("mp4 video/mpeg4");//contentType里面的内容要对应mp4格式的啊
                    String modelName1 = java.net.URLEncoder.encode(modelName, "UTF-8").replaceAll("%28", "\(").replaceAll("%29", "\)"); 
                    response.setHeader("Content-disposition", "attachment;filename="+modelName1);    
                }
                OutputStream outputStream = response.getOutputStream();  
                byte[] bytes = new byte[2000];
                int a;
                while((a = bufferedInputStream.read(bytes)) != -1) {
                    outputStream.write(bytes, 0, a);
                }
                bufferedInputStream.close();
                outputStream.flush();
                outputStream.close(); 
            } catch (UnsupportedEncodingException e) {
                 logger.error("下载视频文件名转换异常"+e);
            } catch (FileNotFoundException e) {
                 logger.error("下载视频文件没有找到对应的视频名异常"+e);
            } catch (IOException e) {
                 logger.error("下载视频文件名IO异常"+e);
            }
            return null;
        }
    
    }

     上传:

    /***
     * http://localhost:8080/testWeb/home.jsp
     * @author 80002795
     *
     */
    @Controller
    @RequestMapping("upload")
    public class Upload {
        
        /*
         * 通过流的方式上传文件
         * @RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象
         */
        @RequestMapping("fileUpload")
        public void fileUpload(@RequestParam("file01") CommonsMultipartFile commonsMultipartFile) throws IOException {
             
            InputStream is = null;
            OutputStream os = null;
            
            System.out.println(commonsMultipartFile.getOriginalFilename());// 员工信息安全手册.pdf
            System.out.println(commonsMultipartFile.getFileItem().getName());// C:UsersPublicDesktop员工信息安全手册.pdf
            System.out.println(commonsMultipartFile.getContentType());// application/pdf
            
            long  startTime=System.currentTimeMillis();
             
            try {
                is=commonsMultipartFile.getInputStream();//哈哈,通过这个就可以获取输入流了,说白了通过这个方法就是复制了
                //得到输出流
                //commonsMultipartFile.getOriginalFilename()这个方法是获取导入文件的文件名,说白了下面的代码就是得到文件名,用时间肯定要保持数据的独立性啊
                String childFileName = new SimpleDateFormat("yyyyMMddHHmmss").format(Calendar.getInstance().getTime()) + commonsMultipartFile.getOriginalFilename();
                System.out.println(childFileName);
                //导入之后,要存进哪里的路径,如果没有这个路径,就创建一个呗
                String parentPath = "E:\upload\upload22\upload33";
                File filePart = new File(parentPath);
                if (!filePart.exists()) {
                    filePart.mkdirs();
                }
                File fileAll = new File(filePart,childFileName);//记得,关于这个构造方法,第一个参数可以有两种形式,一种是File对象,一种是string类型的路径
                os=new FileOutputStream(fileAll); //获取输出流
                
                // 粘贴输入流到输出流
                int temp;
                while((temp=is.read()) != -1){ //一个一个字节的读取并写入
                    os.write(temp);
                }
                
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } finally {
                is.close();
                os.flush();
                os.close();
            }
            long  endTime=System.currentTimeMillis();
            System.out.println("方法一的运行时间:"+String.valueOf(endTime-startTime)+"ms");// 得到的时间大概是:14850ms,实在太慢了
        }
        
        /*
         * 采用file.Transto 来保存上传的文件
         */
        @RequestMapping("fileUpload02")
        public void fileUpload02(@RequestParam("file02") CommonsMultipartFile commonsMultipartFile, HttpServletRequest request) throws IOException {
           long  startTime=System.currentTimeMillis();
           try {
           //除了上传文件,还要得到其它参数啊
           String name = request.getParameter("name");
    //获得文件名并且得到指定路径 //commonsMultipartFile.getOriginalFilename()这个方法是获取导入文件的文件名,说白了下面的代码就是得到文件名,用时间肯定要保持数据的独立性啊 String childFileName = new SimpleDateFormat("yyyyMMddHHmmss").format(Calendar.getInstance().getTime()) + commonsMultipartFile.getOriginalFilename(); //导入之后,要存进哪里的路径,如果没有这个路径,就创建一个呗 String parentPath = "E:\upload\upload22\upload33"; File filePart = new File(parentPath); if (!filePart.exists()) { filePart.mkdirs(); } File fileAll = new File(filePart,childFileName);//记得,关于这个构造方法,第一个参数可以有两种形式,一种是File对象,一种是string类型的路径 commonsMultipartFile.transferTo(fileAll);//仔细看与上面的差异,其实,有了这句话,就不用再写获得输入流,创建输出流,写流了,就这么一句话就搞定了。如果再获得输入流的话,就会包io异常:Destination file already exists and could not be deleted } catch (FileNotFoundException e) { e.printStackTrace(); } long endTime=System.currentTimeMillis(); System.out.println("方法二的运行时间:"+String.valueOf(endTime-startTime)+"ms");// 得到的时间大概是:10ms } /* *采用spring提供的上传文件的方法,这种方法又长又丑,都不想看了 */ @RequestMapping("springUpload") public void springUpload(HttpServletRequest request) throws IllegalStateException, IOException { long startTime=System.currentTimeMillis(); CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver(request.getSession().getServletContext());//将当前上下文初始化给 CommonsMutipartResolver (多部分解析器) //检查form中是否有enctype="multipart/form-data" if(multipartResolver.isMultipart(request)){ //将request变成多部分request MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request; //获取multiRequest 中所有的文件名 Iterator iter=multiRequest.getFileNames(); while(iter.hasNext()){ //一次遍历所有文件 MultipartFile file=multiRequest.getFile(iter.next().toString()); if(file!=null){ String path="E:/springUpload"+file.getOriginalFilename(); File file2 = new File(path); file.transferTo(file2); } } } long endTime=System.currentTimeMillis(); System.out.println("方法三的运行时间:"+String.valueOf(endTime-startTime)+"ms");//输出9ms } @RequestMapping("getMultipartFile") public void getMultipartFile(MultipartFile multipartFile) throws Exception { long startTime=System.currentTimeMillis(); try { // String fileName = multipartFile.getName(); String parentPath = "E:\upload\upload22\upload33"; File filePart = new File(parentPath); if (!filePart.exists()) { filePart.mkdirs(); } File fileAll = new File(filePart,"444444");//记得,关于这个构造方法,第一个参数可以有两种形式,一种是File对象,一种是string类型的路径 multipartFile.transferTo(fileAll); } catch (Exception e) { e.printStackTrace(); } long endTime=System.currentTimeMillis(); System.out.println("方法四的运行时间:"+String.valueOf(endTime-startTime)+"ms"); } }

    END

  • 相关阅读:
    Numpy用于数组的文件输入输出
    numpy利用数组进行数据处理
    numpy的通用函数:快速的元素级数组函数
    NumPy基础知识:数组和矢量计算
    数据处理任务介绍
    Django的ModelForm
    Http1.0和Http1.1的主要区别
    静态库中如何包含资源文件
    zt 正则
    oc调用swift的打包.a / framework 不成功?!
  • 原文地址:https://www.cnblogs.com/ericguoxiaofeng/p/9322358.html
Copyright © 2011-2022 走看看