最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java瀏覽器文件打包下載過程解析

 更新時(shí)間:2019年10月31日 10:16:06   作者:故城歸人  
這篇文章主要介紹了java瀏覽器文件打包下載過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

最近,在項(xiàng)目中遇到了需要將一系列的圖片打包下載的需求,借鑒了網(wǎng)上的一些通用方法,就順便分享出來實(shí)現(xiàn)的方法,不太記得借鑒的是哪位兄弟的博客了,總之萬分感謝,進(jìn)入正題,實(shí)現(xiàn)打包下載的基本功能:

1.controller層代碼:

/**
   * 圖片壓縮打包
   */
  @RequestMapping(value = "/zipFile")
  public void compressionFile(HttpServletRequest request, HttpServletResponse response,String busiId) throws Exception{
    //業(yè)務(wù)代碼,根據(jù)前臺(tái)傳來的ID查詢到資源表的圖片list
    SubMetaData subMetaData = subMetaDataService.findByBusiId(busiId);
    if (subMetaData != null) {
      List<SubMetaDataAtt> list = subMetaDataAttService.findByDataId(subMetaData.getDataId());
      if (list.size() > 0){
        subMetaDataAttService.downloadAllFile(request,response,list);
      }
    }
  }

2.service層通用的文件打包下載

/**
   * 將多個(gè)文件進(jìn)行壓縮打包,解決文件名下載后的亂碼問題
   *
   */
  public void downloadAllFile(HttpServletRequest request, HttpServletResponse response, List<SubMetaDataAtt> list) throws UnsupportedEncodingException{
    String downloadName = "附件圖片.zip";
    String userAgent = request.getHeader("User-Agent");
    // 針對(duì)IE或者以IE為內(nèi)核的瀏覽器:
    if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
      downloadName = java.net.URLEncoder.encode(downloadName, "UTF-8");
    } else {
      // 非IE瀏覽器的處理:
      downloadName = new String(downloadName.getBytes("UTF-8"), "ISO-8859-1");
    }
//經(jīng)過上面的名稱處理即可解決文件名下載后亂碼的問題
    response.setContentType("multipart/form-data");
    response.setCharacterEncoding("UTF-8");
    response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", downloadName));
    //response.setHeader("Content-Disposition", "attachment;fileName=" + downloadName);
    OutputStream outputStream = null;
    ZipOutputStream zos = null;
    try {
      outputStream = response.getOutputStream();
      zos = new ZipOutputStream(outputStream);
      // 將文件流寫入zip中,此方法在下面貼出
      downloadTolocal(zos,list);
    } catch (IOException e) {
      logger.error("downloadAllFile-下載全部附件失敗",e);
    }finally {
      if(zos != null) {
        try {
          zos.close();
        } catch (Exception e2) {
          logger.info("關(guān)閉輸入流時(shí)出現(xiàn)錯(cuò)誤",e2);
        }
      }
      if(outputStream != null) {
        try {
          outputStream.close();
        } catch (Exception e2) {
          logger.info("關(guān)閉輸入流時(shí)出現(xiàn)錯(cuò)誤",e2);
        }
      }

    }

  }

將文件寫入zip中的方法:

private void downloadTolocal(ZipOutputStream zos, List<SubMetaDataAtt> list) throws IOException {
    //獲取文件信息//此處為業(yè)務(wù)代碼,可根據(jù)自己的需要替換,我在這里是將資源表list循環(huán)出取得路徑以及文件名,然后放進(jìn)ZipEntry中再執(zhí)行下載。
    for (SubMetaDataAtt subMetaDataAtt : list) {
      String fileId = subMetaDataAtt.getAttId();
      String fileName = subMetaDataAtt.getFileAlias()+subMetaDataAtt.getFileSuffixName();
      String path = subMetaDataAtt.getFileAbsolutePath();
      InputStream is = null;
      BufferedInputStream in = null;
      byte[] buffer = new byte[1024];
      int len;
      //創(chuàng)建zip實(shí)體(一個(gè)文件對(duì)應(yīng)一個(gè)ZipEntry)
      ZipEntry entry = new ZipEntry(fileName);
      try {
        //獲取需要下載的文件流
        File file= new File(path);
        if(file.exists()){
          is = new FileInputStream(file);
        }
        in = new BufferedInputStream(is);
        zos.putNextEntry(entry);
        //文件流循環(huán)寫入ZipOutputStream
        while ((len = in.read(buffer)) != -1 ) {
          zos.write(buffer, 0, len);
        }
      } catch (Exception e) {
        logger.info("下載全部附件--壓縮文件出錯(cuò)",e);
      }finally {
        if(entry != null) {
          try {
            zos.closeEntry();
          } catch (Exception e2) {
            logger.info("下載全部附件--zip實(shí)體關(guān)閉失敗",e2);
          }
        }
        if(in != null) {
          try {
            in.close();
          } catch (Exception e2) {
            logger.info("下載全部附件--文件輸入流關(guān)閉失敗",e2);
          }
        }
        if(is != null) {
          try {
            is.close();
          }catch (Exception e) {
            logger.info("下載全部附件--輸入緩沖流關(guān)閉失敗",e);
          }
        }


      }

    }

3.前臺(tái)js的請(qǐng)求方法:

注:文件的下載不要使用AJAX請(qǐng)求的方法,這樣是無法響應(yīng)請(qǐng)求的,一般會(huì)采用Window.open的方法。

window.open(context+"/sub/submetadataatt/zipFile?busiId="+downloadId);//這里的downloadId是我需要傳到后臺(tái)的變量。

總結(jié):關(guān)于上傳,下載的操作,實(shí)際上是要對(duì)于java的IO十分熟悉,才可以玩的轉(zhuǎn),大家一定要把握好基礎(chǔ)才可以在項(xiàng)目中游刃有余,不像我需要去借鑒他人的東西,大家一起努力,加油!

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

淮滨县| 花垣县| 合山市| 长兴县| 宽甸| 古交市| 右玉县| 凤庆县| 武义县| 渭源县| 苍梧县| 靖江市| 阳山县| 科尔| 诸城市| 湾仔区| 巴彦县| 长寿区| 迭部县| 肇庆市| 普安县| 博客| 华容县| 墨脱县| 马公市| 翁牛特旗| 天柱县| 东乌| 克什克腾旗| 祁连县| 互助| 乌兰察布市| 马鞍山市| 定日县| 田东县| 洛南县| 旬邑县| 柳江县| 开江县| 百色市| 开平市|