一个关于Web项目播放视频的问题

最近没环境,也无法测试,就是想问一下大神们的思路。
需求简单点来说就是在网页上播放服务器上的视频。
没搞过这个,只会用video标签播放本地视频,求各位大大提供下思路。
如果是C/S项目的话,有什么好的方案吗?通过FTP传到客户端?

B/S 的可以搭建一个流媒体,通过流媒体进行视频播放

就用video标签呗,又不是不能用

完整程序FTP上传

package com.zhcw.update.msisdn;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;

/**

  • Title: FTP上传功能类
  • Description: FTP上传功能类
  • Copyright: Copyright (c) 2012
  • Company: 北京世纪国彩科技有限公司 *
  • @author chenchuang
  • @version 1.0
    */
    public class FtpUtil {
    private String ip="";
    private String username="";
    private String password="";
    private int port=-1;
    private String path="";
    FtpClient ftpClient=null;
    OutputStream os=null;
    FileInputStream is=null;

    public FtpUtil(String serverIp ,String username,String password){
    this.ip=serverIp;
    this.username=username;
    this.password=password;
    }

    public FtpUtil(String serverIp , int port,String username,String password){
    this.ip=serverIp;
    this.port=port;
    this.username=username;
    this.password=password;
    }

    public static void main(String args[]){
    FtpUtil ftp=new FtpUtil("172.16.10.142","admin","adminly");
    ftp.connectServer();
    boolean result=ftp.upload("C:/Documents and Settings/SJKC/桌面/java/cc.txt", "cc.txt");
    // boolean result=ftp.downloadFile("C:/Documents and Settings/SJKC/桌面/java/cc.txt", "cc.txt");
    System.out.println(result ? "上传成功!" : "上传失败!");
    ftp.closeServer();
    }

    /**

    • ftp上传 如果服务器段已存在名为newName的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换
    • @param fileName 要上传的文件(或文件夹)名
    • @param newName 服务器端要生成的文件(或文件夹)名
    • @return */ public boolean upload(String fileName,String newName){ try{ String savefilename=new String(fileName.getBytes("GBK"),"GBK"); File file_in = new File(savefilename);// 打开本地待长传的文件 if (!file_in.exists()) { throw new Exception("此文件或文件夹[" + file_in.getName() + "]有误或不存在!"); } if (file_in.isDirectory()) { upload(file_in.getPath(), newName, ftpClient.pwd()); } else { uploadFile(file_in.getPath(), newName); } if (is != null) { is.close(); } if (os != null) { os.close(); } return true; } catch (Exception e) { e.printStackTrace(); System.err.println("Exception e in Ftp upload(): " + e.toString()); return false; } finally { try { if (is != null) { is.close(); } if (os != null) { os.close(); } } catch (IOException e) { e.printStackTrace(); } } }

    /**

    • 真正用于上传的方法
    • @param fileName
    • @param newName
    • @param path */ private void upload(String fileName, String newName, String path) throws Exception{ String savefilename=new String(fileName.getBytes("ISO-8859-1"),"GBK"); File file_in=new File(savefilename);//打开本地待上传的文件 if(!file_in.exists()){ throw new Exception("此文件或文件夹["+file_in.getName()+"]有误或不存在!"); } if(file_in.isDirectory()){ if(!isDirExist(newName)){ createDir(newName); } ftpClient.cd(newName); File sourceFile[]=file_in.listFiles(); for(int i=0;i<sourceFile.length;i++){ if(!sourceFile[i].exists()){ continue; } if(sourceFile[i].isDirectory()){ this.upload(sourceFile[i].getPath(),sourceFile[i].getName(),path+"/"+newName); }else{ this.upload(sourceFile[i].getPath(),sourceFile[i].getName()); } } }else{ uploadFile(file_in.getPath(),newName); } ftpClient.cd(path); }

    /**

    • 在当前目录下创建文件夹
    • @param dir
    • @return
      /
      private boolean createDir(String dir){
      try{
      ftpClient.ascii();//转换到字符模式下
      StringTokenizer s=new StringTokenizer(dir,"/");//sign(记号,符号)
      s.countTokens();
      /
      *
      * countTokens
      public int countTokens()计算在生成异常之前可以调用此 tokenizer 的 nextToken 方法的次数。当前位置没有提前。

          返回:
          使用当前分隔符集的字符串中剩余的标记数。
      
          以上是API中的说明,
          我写了一个小程序:
          import java.util.*;
          public class Tokenizer{
             public static void main(String[] args){
                 StringTokenizer a = new StringTokenizer("a b c");
                 System.out.println(a.countTokens());
             } 
          }
          程序执行的结果是3,因为a b c采用默认的分隔符分隔,一共有a,b,c三个token,所以countTokens()的结果是3
       */
      String pathName=ftpClient.pwd();
      while(s.hasMoreElements()){
          pathName=pathName+"/"+(String)s.nextElement();
          try{
              ftpClient.sendServer("MKD "+pathName+"\r\n");
          }catch(Exception e){
              e=null;
              return false;
          }
          ftpClient.readServerResponse();
      }
      ftpClient.binary();
      return true;
      

      }catch(IOException ee){
      ee.printStackTrace();
      return false;
      }
      }

    /**

    • 连接ftp服务器
    • @return */ public boolean connectServer(){ ftpClient=new FtpClient(); try{ if(this.port!=-1){ ftpClient.openServer(this.ip,this.port); }else{ ftpClient.openServer(this.ip); } ftpClient.login(this.username, this.password); if(this.path.length()!=0){ ftpClient.cd(this.path);//path是ftp服务下主目录的子目录 } ftpClient.binary();//使用二进制上传与下载 System.out.println("已登录到\""+ftpClient.pwd()+"\"目录"); return true; }catch(IOException e){ e.printStackTrace(); return false; } }

    /**

    • 断开与ftp服务器的连接
    • @return */ public boolean closeServer(){ try{ if(is!=null){ is.close(); } if(os!=null){ os.close(); } if(ftpClient!=null){ ftpClient.closeServer(); } System.out.println("已与服务器断开连接"); return true; }catch(IOException e){ e.printStackTrace(); return false; } }

    /**

    • 检查文件在当前目录下是否存在
    • @param dir
    • @return */ private boolean isDirExist(String dir){ String pwd=""; try{ pwd=ftpClient.pwd(); ftpClient.cd(dir); ftpClient.cd(pwd); }catch(Exception e){ e.printStackTrace(); return false; } return true; }

    /**

    • ftp上传 如果服务器段已存在名为filename的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换
    • @param filename 要上传的文件(或文件夹)名
    • @return */ public boolean upload(String filename){ String newname=""; if(filename.indexOf("/")>-1){ newname=filename.substring(filename.lastIndexOf("/")+1); }else{ newname=filename; } return upload(filename,newname); }

    /**

    • upload 上传文件
    • @param filename 要上传的文件名
    • @param newname 上传后的新文件名
    • @return -1 文件不存在 >=0 成功上传,返回文件的大小
    • @throws Exception */ public long uploadFile(String filename, String newname) throws Exception { long result = 0; TelnetOutputStream os = null; FileInputStream is = null; try { java.io.File file_in = new java.io.File(filename); if (!file_in.exists())
      return -1; os = ftpClient.put(newname); result = file_in.length(); is = new FileInputStream(file_in); byte[] bytes = new byte[1024]; int c; while ((c = is.read(bytes)) != -1) { os.write(bytes, 0, c); } } finally { if (is != null) { is.close(); } if (os != null) { os.close(); } } return result; }

    /**

    • 从ftp下载文件到本地
    • @param filename 服务器上的文件名
    • @param newfilename 本地生成的文件名
    • @return
    • @throws Exception */ public long downloadFile(String filename, String newfilename) { long result = 0; TelnetInputStream is = null; FileOutputStream os = null; try { is = ftpClient.get(filename); java.io.File outfile = new java.io.File(newfilename); os = new FileOutputStream(outfile); byte[] bytes = new byte[1024]; int c; while ((c = is.read(bytes)) != -1) { os.write(bytes, 0, c); result = result + c; } } catch (IOException e) { e.printStackTrace(); } finally { try { if (is != null) { is.close(); } if (os != null) { os.close(); } } catch (IOException e) { e.printStackTrace(); } } return result; }

    /**

    • 取得相对于当前连接目录的某个目录下所有文件列表
    • @param path
    • @return */ @SuppressWarnings({ "unchecked", "deprecation" }) public List getFileList(String path){ List list = new ArrayList(); DataInputStream dis; try { dis = new DataInputStream(ftpClient.nameList(this.path + path)); String filename = ""; while ((filename = dis.readLine()) != null) { list.add(filename); } } catch (IOException e) { e.printStackTrace(); } return list; }

}