下载:

/*
 * 说白了其实导出就是复制粘贴(从存储在云上的文件复制到用户的本地硬盘上):                      
 * 先取得路径,然后根据路径来复制 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:\20171128\esim-80002795\esim-service\esim\esim-web\src\main\webapp\excel\险种组合管理表.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:\Users\Public\Desktop\员工信息安全手册.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");
    }
    
}