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