ftp的理解與使用(下)

對於搭建好的ftp,肯定要拿Java來測試連接的了,目前我還是從衆多的網站分享中看到很多優秀的ftpClient的使用,但是這些都是作者自己優秀的編碼風格,所以要各個借鑑來,運用到自己的實際需求中,下面我直接簡潔的將自己運用的記錄下來:
目前我的需求就是將ftp上的圖片和音頻讀取出來展示到頁面上去,那麼讀取音頻和圖片的方法有很多種,一般都是將ftp上的數據讀取出來轉換位base64位來傳輸給前端的,
<img src="<%=picBase64%>" id="<%=picId%>" / />標籤和<embed id=“a_player_ie8” type=“audio/mpeg” controls=“playbutton” src="<%=voiceSrc%>" autostart=“false”//>
記得去除//
我們公司用的前端還是JSP,而且還是HTML,所以我前端的標籤中會出現Java代碼和音頻用的是embed,因爲ie8中標籤audio不能使用這些都是html5中的標籤,只支持ie9以上。
如果是谷歌瀏覽器:(audio標籤是HTML5中的,IE不支持) <//audio src=“文件路徑” controls=“controls” width=“30px”> </audio//>如果是IE瀏覽器:(embed標籤在IE8中可以替代audio) <//embed id=“a_player_ie8” type=“audio/mpeg” src=“文件路徑” autostart=“false”></embed//>

獲取圖片和音頻一般都是直接將其轉換位base64位的String然後傳給前端
音頻的:

在這裏插入圖片描述

/*
圖片的
轉換爲64位圖片
        * System.out.println("=====================圖片=============================>>");
        *  inputStream = ftpClient.retrieveFileStream(fileName);
        *  if (inputStream != null && ftpUrl.equals("image")) { System.out.println("=====================圖片轉換base64位開始=============================>>");
        *  byte[] data = null; 
        * ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
        * data = new
        * byte[inputStream.available()]; int len = 0; 
        * while ((len = inputStream.read(data)) != -1) 
        * { outStream.write(data, 0, len); } 
        * data = outStream.toByteArray();
        * 下面有兩種轉換的方法
        *  re = Base64.encodeBase64String(data);
        * 
        * BASE64Encoder encoder = new BASE64Encoder(); 
        * re = encoder.encode(data);
        * 
        * if ("gif".equalsIgnoreCase(suffix)) {
        *  re = "data:image/gif;base64," + re; } 
        * else if ("png".equalsIgnoreCase(suffix)) {
        *  re = "data:image/png;base64," + re; 
        * } else if ("bmp".equalsIgnoreCase(suffix)) {
        *  re = "data:image/bmp;base64," + re; 
        * } System.out.println("=====================圖片轉換base64位結束=============================re::>>"); outStream.close();
        * inputStream.close(); }
        */

但是我發現如果全部從ftp上獲取轉換base64位的話一個圖片就佔用我3秒的時間,那如果很多的話,客戶不得砍死我,公司又沒有圖片服務器,那我只能存儲在項目服務器上面新建立的文件夾下面,這樣前端讀取的速度就很快了。
下面是ftpClient的連接與關閉和io流的下載

private static FTPClient ftpClient = new FTPClient();
/**
  * 建立ftp服務器連接
  * 
  * @param ip
  *            服務器IP
  * @param port
  *            服務器端口
  * @param user
  *            用戶名
  * @param password
  *            密碼
  * @param path
  *            服務器路徑
  * @author
  * @date
  */
public static String connectServer(String ip, int port, String user, String password) {
  try {
   ftpClient.setConnectTimeout(20 * 1000);// ftp超時設置
   ftpClient.connect(ip, port);// ip地址,端口號
   ftpClient.login(user, password);
   ftpClient.setControlEncoding("UTF-8");
   ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
   ftpClient.enterLocalPassiveMode();
   // 是否成功登錄服務器
   int reply = ftpClient.getReplyCode();
   if (!FTPReply.isPositiveCompletion(reply)) {
    closeConnect(ftpClient);
    return "false";
   } 
  } catch (IOException ex) {
   ex.printStackTrace();
  }
  return "";
 }
 /**
  * 關閉ftp連接
  */
 public static void closeConnect(FTPClient ftpClient) {
  if (ftpClient.isConnected()) {
   try {
    ftpClient.disconnect();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }
 public static String downFile(String ftpUrl, String paramFileName, String ip, String port, String user, String pwd, String localpath, String fileSeparator) throws Exception {
  String re = null;
  if (!Util.isEmpty(ip) && !Util.isEmpty(port)&& !Util.isEmpty(user)&& !Util.isEmpty(pwd)) {
   String loginFlag = connectServer(ip, Integer.valueOf(port), user, pwd);
   if (loginFlag.equals("false")) {
    return "";
   }
   InputStream inputStream = null;
   try {
    // 跳轉到指定目錄
    String url = "";
    boolean changedir = ftpClient.changeWorkingDirectory("/" + ftpUrl);
    if (!changedir) {
     return re;
    }
    // 遍歷下載的目錄
    FTPFile[] fs = ftpClient.listFiles();
    if (fs == null || fs.length == 0) {
     System.out.println("=====================跳轉路徑成功後該路徑下沒有該文件夾=============================>>" + ftpUrl);
     return re;
    }
    for (FTPFile ff : fs) {
     // 解決中文亂碼問題,兩次解碼
     byte[] bytes = ff.getName().getBytes("iso-8859-1");
     String fileName = new String(bytes, "utf-8");
     if (paramFileName.equals(fileName)) {
      String suffix = paramFileName.substring(paramFileName.lastIndexOf(".") + 1, paramFileName.length());
      if (ftpUrl.equals("image")) {// 獲取圖片
       /*轉換爲64位圖片
        * System.out.println("=====================圖片=============================>>"); inputStream = ftpClient.retrieveFileStream(fileName); if (inputStream != null && ftpUrl.equals("image")) { System.out.println("=====================圖片轉換base64位開始=============================>>"); byte[] data = null; ByteArrayOutputStream outStream = new ByteArrayOutputStream(); data = new
        * byte[inputStream.available()]; int len = 0; while ((len = inputStream.read(data)) != -1) { outStream.write(data, 0, len); } data = outStream.toByteArray(); re = Base64.encodeBase64String(data);
        * 
        * BASE64Encoder encoder = new BASE64Encoder(); re = encoder.encode(data);
        * 
        * if ("gif".equalsIgnoreCase(suffix)) { re = "data:image/gif;base64," + re; } else if ("png".equalsIgnoreCase(suffix)) { re = "data:image/png;base64," + re; } else if ("bmp".equalsIgnoreCase(suffix)) { re = "data:image/bmp;base64," + re; } System.out.println("=====================圖片轉換base64位結束=============================re::>>"); outStream.close();
        * inputStream.close(); }
        */
       OutputStream is = new FileOutputStream(localpath + fileSeparator + ff.getName());
       ftpClient.retrieveFile(ff.getName(), is);
       re = "images/TemporaryImagePath/" + ff.getName();
       is.close();
      } else {// 獲取文件
       OutputStream is = new FileOutputStream(localpath + fileSeparator + ff.getName());
       ftpClient.retrieveFile(ff.getName(), is);
       re =  "images/TemporaryImagePath/" + ff.getName();
       is.close();
      }
      break;
     }
    }
   } catch (Exception e) {
    e.printStackTrace();
   } finally {
    closeConnect(ftpClient);
   }
  }
  return re;
 }

下面的就是我從ftp上面下載圖片和音頻然後直接存儲到服務端創建好的文件夾下面,可以提高程序的運行效率

其中的req就是request,公司封裝好的靜態而已
 /* String serverPath = req.getRealPath("/"); 過時的方法 */
  String serverPath = req.getSession().getServletContext().getRealPath("/");// 替換的方法
  String fileSeparator = System.getProperty("file.separator");//系統分割符
  HashMap<String, List<String>> picMap = new HashMap<String, List<String>>();// 圖片的map
    HashMap<String, String> voiceMap = new HashMap<String, String>();// 音頻的map
if (!Util.isEmpty(mbMemoList)) {//這個就是我從移動端存在ftp上面的圖片路徑和音頻路徑的list實體類集合
     for (int i = 0; i < mbMemoList.size(); i++) {
      MbMemo mo = mbMemoList.get(i);
      // ftp獲取圖片base64方法,轉換爲base64位太慢了,只能存儲在服務端的某個文件夾下,需要定時去刪除
      /*
       * if (!Util.isEmpty(mo.getImgFiles())) { String imgfiles = mo.getImgFiles(); String[] imgArr = imgfiles.split(";"); List<String> picBase64List = new ArrayList<String>(); for (int j = 0; j < imgArr.length; j++) { String[] urlARR = imgArr[j].split("/"); String picBase64 = downFile(urlARR[1], urlARR[2], ip, port, user, pwd,localpath,fileSeparator); if
       * (!Util.isEmpty(picBase64)) { picBase64List.add(picBase64); } } if (!Util.isEmpty(picBase64List)) { picMap.put(mo.getMemoSN(), picBase64List); } }
       */
      // 直接下載存儲到服務端
      if (!Util.isEmpty(mo.getImgFiles())) {
       String imgfiles = mo.getImgFiles();
       String[] imgArr = imgfiles.split(";");
      
       List<String> picPathList = new ArrayList<String>();
       for (int j = 0; j < imgArr.length; j++) {
        String[] urlARR = imgArr[j].split("/");
        File localFile = new File(serverPath + fileSeparator + "images" + fileSeparator + "TemporaryImagePath" + fileSeparator + urlARR[2]);// 存儲在臨時圖片的文件路徑上面
        String resultPath = "";
        if (!localFile.exists()) {// 查看服務端是否存儲了圖片,沒有的話去ftp上獲取
         resultPath = downFile(urlARR[1], urlARR[2], ip, port, user, pwd, serverPath + fileSeparator + "images" + fileSeparator + "TemporaryImagePath", fileSeparator);
        } else {
         resultPath = "images/TemporaryImagePath/" + urlARR[2];
        }
        if (!Util.isEmpty(resultPath)) {
         picPathList.add(resultPath);
        }
        if (!Util.isEmpty(picPathList)) {
         picMap.put(mo.getMemoSN(), picPathList);
        }
       }
      }
      // ftp獲取音頻文件
      if (!Util.isEmpty(mo.getVoiceFiles())) {
       String voiceFiles = mo.getVoiceFiles();
       String[] voiceArr = voiceFiles.split("/");
       File localFile = new File(serverPath + fileSeparator + "images" + fileSeparator + "TemporaryImagePath" + fileSeparator + voiceArr[2]);
       String resultVoice = "";
       if (!localFile.exists()) {// 判斷是否存儲了音頻,沒有的話去ftp上獲取
        resultVoice = downFile(voiceArr[1], voiceArr[2], ip, port, user, pwd, serverPath + fileSeparator + "images" + fileSeparator + "TemporaryImagePath", fileSeparator);
       } else {// 如果存在直接返回
        resultVoice = "images/TemporaryImagePath/" + voiceArr[2];//這個是給前端獲取的地址
       }
       if (!Util.isEmpty(resultVoice)) {
        voiceMap.put(mo.getMemoSN(), resultVoice);
       }
      }
     }
    }
    

前端獲取的方法:在這裏插入圖片描述

借鑑的ftp下載優秀的文章:
https://www.cnblogs.com/renjie0520/p/5714279.html
https://blog.csdn.net/hanziang1996/article/details/100557222
https://blog.csdn.net/weixin_38497019/article/details/90475980
https://www.cnblogs.com/mlgm/p/7788739.html
https://www.cnblogs.com/1012hq/p/11377850.html
https://blog.csdn.net/zty1317313805/article/details/80809414
https://blog.csdn.net/xzw_123/article/details/51679236

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章