上傳視訊到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伺服器存放和讀取視訊。