1. 程式人生 > >上傳視訊到FTP伺服器+播放

上傳視訊到FTP伺服器+播放

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

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

首先呢,當然是建立FTP伺服器,要開兩個埠號去建立兩個FTP,

一個用來上傳(需要使用者名稱密碼登入,設定寫入許可權、讀取許可權),一個用來播放(可以匿名訪問,設定讀取許可權)

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

先是碰到資料夾可以開啟但瀏覽器打不開(在瀏覽器Internet選項-高階裡面找到“使用被動FTP(用於防火牆和DSL調變解調器的相容)”,預設是勾選的,把勾去掉就好了),

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

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

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

然後把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伺服器存放和讀取視訊。