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

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