上传视频到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

代码:

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

到这里,所有的工作都做完啦,是不是很简单呢~~~(^o^)/~

===============================================================================================================
好吧,还没嘚瑟够两天,领导又给了新的需求,让同时支持TOMCAT目录上传和FTP上传,不过这个没有什么技术难度了~最后把存到数据库的路径改成了后半截(/portal/upload/upload_20161014160316.mp4这样的)~通过读取配置文件里的参数,确定用tomcat还是ftp服务器存放和读取视频。

你可能感兴趣的:(视频,ftp服务器)