上傳視頻到FTP服務器+播放

上傳視頻到FTP服務器,是針對上個需求(上傳視頻到tomcat下並播放)完善的,畢竟上傳到tomcat目錄下的話,放幾個視頻文件磁盤就滿了,所以存到另外的服務器是必然的。

由於video.js裏播放視頻的標籤不支持絕對路徑(如D:/這樣的),只能存放在tomcat下面的相對路徑,所以跳過了存放其他磁盤的步驟,直接開始試驗FTP服務器了。

首先呢,當然是建立FTP服務器,要開兩個端口號去建立兩個FTP,

一個用來上傳(需要用戶名密碼登錄,設置寫入權限、讀取權限),一個用來播放(可以匿名訪問,設置讀取權限)

建立這個過程真是一把辛酸淚啊,,

先是碰到文件夾可以打開但瀏覽器打不開(在瀏覽器Internet選項-高級裏面找到“使用被動FTP(用於防火牆和DSL調制解調器的兼容)”,默認是勾選的,把勾去掉就好了),

瀏覽器打不開的話呢,video標籤就不能播放。。後來發現在家裏這麼建立FTP是好用的,但是在公司還是不行,

折騰很久之後想起來公司上網是要設置代理服務器的,這就導致了和FTP衝突?目前也沒明白原因,不過既然不影響我幹活了,就略過了。

===============================================================================================================

FTP服務器建立好了之後,下載一個commons-net-3.5.jar的包,網址http://commons.apache.org/proper/commons-net/download_net.cgi

然後把jar包拷進項目後,就可以進行開發啦。。。。(內心:終於到這一步了)

代碼如下(上傳、下載、刪除):

FavFTPUtil.Java

 package com.favccxx.favsoft.util;

 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;

 import org.apache.commons.net.ftp.FTPClient;
 import org.apache.commons.net.ftp.FTPFile;
 import org.apache.commons.net.ftp.FTPReply;

 public class FavFTPUtil {

      /**
      * 上傳文件(可供Action/Controller層使用)
      * @param hostname FTP服務器地址
      * @param port FTP服務器端口號
      * @param username FTP登錄帳號
      * @param password FTP登錄密碼
      * @param pathname FTP服務器保存目錄
      * @param fileName 上傳到FTP服務器後的文件名稱
      * @param inputStream 輸入文件流
      * @return
      */
      public static boolean uploadFile(String hostname, int port, String username, String password, String pathname, String fileName, InputStream inputStream){
          boolean flag = false;
          FTPClient ftpClient = new FTPClient();
          ftpClient.setControlEncoding("UTF-8");
          try {
              //連接FTP服務器
              ftpClient.connect(hostname, port);
              //登錄FTP服務器
              ftpClient.login(username, password);
              //是否成功登錄FTP服務器
              int replyCode = ftpClient.getReplyCode();
              if(!FTPReply.isPositiveCompletion(replyCode)){
                 return flag;
              }

              ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
              ftpClient.makeDirectory(pathname);
              ftpClient.changeWorkingDirectory(pathname);
              ftpClient.storeFile(fileName, inputStream);
              inputStream.close();
              ftpClient.logout();
              flag = true;
          } catch (Exception e) {
             e.printStackTrace();
          } finally{
              if(ftpClient.isConnected()){
                  try {
                     ftpClient.disconnect();
                  } catch (IOException e) {
                     e.printStackTrace();
                  }
              }
          }
          return flag;
      }


      /**
      * 上傳文件(可對文件進行重命名)
      * @param hostname FTP服務器地址
      * @param port FTP服務器端口號
      * @param username FTP登錄帳號
      * @param password FTP登錄密碼
      * @param pathname FTP服務器保存目錄
      * @param filename 上傳到FTP服務器後的文件名稱
      * @param originfilename 待上傳文件的名稱(絕對地址)
      * @return
      */
      public static boolean uploadFileFromProduction(String hostname, int port, String username, String password, String pathname, String filename, String originfilename){
          boolean flag = false;
          try {
              InputStream inputStream = new FileInputStream(new File(originfilename));
              flag = uploadFile(hostname, port, username, password, pathname, filename, inputStream); 
          } catch (Exception e) {
             e.printStackTrace();
          }
          return flag;
      }

      /**
      * 上傳文件(不可以進行文件的重命名操作)
      * @param hostname FTP服務器地址
      * @param port FTP服務器端口號
      * @param username FTP登錄帳號
      * @param password FTP登錄密碼
      * @param pathname FTP服務器保存目錄
      * @param originfilename 待上傳文件的名稱(絕對地址)
      * @return
      */
      public static boolean uploadFileFromProduction(String hostname, int port, String username, String password, String pathname, String originfilename){
          boolean flag = false;
          try {
              String fileName = new File(originfilename).getName();
              InputStream inputStream = new FileInputStream(new File(originfilename));
              flag = uploadFile(hostname, port, username, password, pathname, fileName, inputStream); 
          } catch (Exception e) {
             e.printStackTrace();
          }
          return flag;
      }


      /**
      * 刪除文件
      * @param hostname FTP服務器地址
      * @param port FTP服務器端口號
      * @param username FTP登錄帳號
      * @param password FTP登錄密碼
      * @param pathname FTP服務器保存目錄
      * @param filename 要刪除的文件名稱
      * @return
      */
      public static boolean deleteFile(String hostname, int port, String username, String password, String pathname, String filename){
          boolean flag = false;
          FTPClient ftpClient = new FTPClient();
          try {
              //連接FTP服務器
              ftpClient.connect(hostname, port);
              //登錄FTP服務器
              ftpClient.login(username, password);
              //驗證FTP服務器是否登錄成功
              int replyCode = ftpClient.getReplyCode();
              if(!FTPReply.isPositiveCompletion(replyCode)){
                 return flag;
              }
              //切換FTP目錄
              ftpClient.changeWorkingDirectory(pathname);
              ftpClient.dele(filename);
              ftpClient.logout();
              flag = true;
          } catch (Exception e) {
             e.printStackTrace();
          } finally{
              if(ftpClient.isConnected()){
                  try {
                     ftpClient.logout();
                  } catch (IOException e) {

                  }
              }
          }
          return flag;
      }

      /**
      * 下載文件
      * @param hostname FTP服務器地址
      * @param port FTP服務器端口號
      * @param username FTP登錄帳號
      * @param password FTP登錄密碼
      * @param pathname FTP服務器文件目錄
      * @param filename 文件名稱
      * @param localpath 下載後的文件路徑
      * @return
      */
      public static boolean downloadFile(String hostname, int port, String username, String password, String pathname, String filename, String localpath){
          boolean flag = false;
          FTPClient ftpClient = new FTPClient();
          try {
              //連接FTP服務器
              ftpClient.connect(hostname, port);
              //登錄FTP服務器
              ftpClient.login(username, password);
              //驗證FTP服務器是否登錄成功
              int replyCode = ftpClient.getReplyCode();
              if(!FTPReply.isPositiveCompletion(replyCode)){
                 return flag;
              }
              //切換FTP目錄
              ftpClient.changeWorkingDirectory(pathname);
              FTPFile[] ftpFiles = ftpClient.listFiles();
              for(FTPFile file : ftpFiles){
              if(filename.equalsIgnoreCase(file.getName())){
                  File localFile = new File(localpath + "/" + file.getName());
                  OutputStream os = new FileOutputStream(localFile);
                  ftpClient.retrieveFile(file.getName(), os);
                  os.close();
              }
              }
              ftpClient.logout();
              flag = true;
          } catch (Exception e) {
             e.printStackTrace();
          } finally{
              if(ftpClient.isConnected()){
                  try {
                     ftpClient.logout();
                  } catch (IOException e) {

                  }
              }
          }
         return flag;
     }

 }
 FavFTPUtilTest.java

 package com.favccxx.favsoft.util;

 import junit.framework.TestCase;

 public class FavFTPTest extends TestCase {

  public void testFavFTPUtil(){
      String hostname = "127.0.0.1";
      int port = 21;
      String username = "business";
      String password = "business";
      String pathname = "business/ebook"; 
      String filename = "big.rar"; 
      String originfilename = "C:\\Users\\Downloads\\Downloads.rar";
      FavFTPUtil.uploadFileFromProduction(hostname, port, username, password, pathname, filename, originfilename);
     // String localpath = "D:/";

     // FavFTPUtil.downloadFile(hostname, port, username, password, pathname, filename, localpath);
  }

 }

===============================================================================================================

上面代碼的下載呢,是從FTP服務器下載到運行tomcat的機器,猛一看沒有什麼不對,

換個角度想,如果代碼部署到測試服務器上,然後用其他機器訪問測試服務器的網址,這時候點了下載就該懵逼啦,哈哈哈哈哈哈哈

如果想下載到客戶端的機器上,參考如下代碼~~~

 /**
  * 下載文件
  * @param hostname FTP服務器地址
  * @param port FTP服務器端口號
  * @param username FTP登錄帳號
  * @param password FTP登錄密碼
  * @param pathname FTP服務器文件目錄
  * @param filename 文件名稱
  * @param localpath 下載後的文件路徑
  * @return
  */
  public static boolean downloadFile(String hostname, int port, String username, String password, String pathname, String filename, String localpath){
      boolean flag = false;
      FTPClient ftpClient = new FTPClient();
      try {
          //連接FTP服務器
          ftpClient.connect(hostname, port);
          //登錄FTP服務器
          ftpClient.login(username, password);
          //驗證FTP服務器是否登錄成功
          int replyCode = ftpClient.getReplyCode();
          if(!FTPReply.isPositiveCompletion(replyCode)){
             return flag;
          }
          //切換FTP目錄
          ftpClient.changeWorkingDirectory(pathname);
          FTPFile[] ftpFiles = ftpClient.listFiles();
          for(FTPFile file : ftpFiles){
              if(filename.equalsIgnoreCase(file.getName())){
                  HttpServletResponse response = StrutsUtil.getResponse();
                 response.reset();
                 response.setContentType("application/octet-stream;charset=UTF-8");
                 response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("gb2312"),"iso8859-1"));
                 response.addHeader("Content-Length", "" + ftpFile.getSize());
                 OutputStream os = response.getOutputStream();
                 ftpClient.retrieveFile(ftpFile.getName(), os);
                 os.flush();
                 os.close();
              }
          }
          ftpClient.logout();
          flag = true;
      } catch (Exception e) {
         e.printStackTrace();
      } finally{
          if(ftpClient.isConnected()){
              try {
                 ftpClient.logout();
              } catch (IOException e) {

              }
          }
      }
     return flag;
 }

===============================================================================================================

寫到這裏,差不多就算寫完了~~,只要上傳下載做完了之後,訪問就很簡單了~

這時候就要用到之前建立的匿名登錄可以訪問FTP的端口(只有讀取權限),只要寫全了網址就可以播放視頻咯。

例子:ftp://192.168.1.1:21/upload/upload_20161014160316.mp4

代碼:

<video id="example_video_1" class="video-js vjs-default-skin" controls preload="none" width="870" height="350" data-setup="{}">
     <source src="ftp://192.168.1.1:21/upload/upload_20161014160316.mp4" type='video/mp4' />
 </video>

===============================================================================================================

到這裏,所有的工作都做完啦,是不是很簡單呢~~~(^o^)/~

===============================================================================================================
好吧,還沒嘚瑟夠兩天,領導又給了新的需求,讓同時支持TOMCAT目錄上傳和FTP上傳,不過這個沒有什麼技術難度了~最後把存到數據庫的路徑改成了後半截(/portal/upload/upload_20161014160316.mp4這樣的)~通過讀取配置文件裏的參數,確定用tomcat還是ftp服務器存放和讀取視頻。

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