6.2.2 创建媒资服务工程 媒资管理的相关功能单独在媒资服务中开发,下边创建媒资服务工程(xc-service-manage-media)。 媒资服务的配置与cms类似,导入 “资料”--》xc-service-manage-media工程,工程结构如下: 6.3上传文件 6.3.1 断点续传解决方案 通常视频文件都比较大,所以对于媒资系统上传文件的需求要满足大文件的上传要求。http协议本身对上传文件大 小没有限制,但是客户的网络环境质量、电脑硬件环境等参差不齐,如果一个大文件快上传完了网断了,电断了没 有上传完成,需要客户重新上传,这是致命的,所以对于大文件上传的要求最基本的是断点续传。 什么是断点续传:

引用百度百科:断点续传指的是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人为的划分为几个 部分,每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的部分开始继续上传 下载未完成的部分,而没有必要从头开始上传下载,断点续传可以提高节省操作时间,提高用户体验性。 如下图:

上传流程如下: 1、上传前先把文件分成块 2、一块一块的上传,上传中断后重新上传,已上传的分块则不用再上传 3、各分块上传完成最后合并文件
文件下载则同理。 6.3.2 文件分块与合并 为了更好的理解文件分块上传的原理,下边用java代码测试文件的分块与合并。 6.3.2.1文件分块 文件分块的流程如下: 1、获取源文件长度 2、根据设定的分块文件的大小计算出块数 3、从源文件读数据依次向每一个块文件写数据。


[mw_shl_code=applescript,true] //测试文件分块方法   
  @Test
     public void testChunk() throws IOException {    
     File sourceFile = new File("F:/develop/ffmpeg/lucene.mp4"); //  
      File sourceFile = new File("d:/logo.png");   
      String chunkPath = "F:/develop/ffmpeg/chunk/";    
     File chunkFolder = new File(chunkPath);    
     if(!chunkFolder.exists()){
            chunkFolder.mkdirs();
}     
    //分块大小 
        long chunkSize = 1024*1024*1;   
      //分块数量      
   long chunkNum = (long) Math.ceil(sourceFile.length() * 1.0 / chunkSize );   
      if(chunkNum<=0){       
      chunkNum = 1;    
     }     
    //缓冲区大小  
       byte[] b = new byte[1024];   
      //使用RandomAccessFile访问文件  
       RandomAccessFile raf_read = new RandomAccessFile(sourceFile, "r");   
      //分块        
for(int i=0;i<chunkNum;i++){   
          //创建分块文件      
       File file = new File(chunkPath+i);   
          boolean newFile = file.createNewFile();  
           if(newFile){    
             //向分块文件中写数据    
             RandomAccessFile raf_write = new RandomAccessFile(file, "rw");           
      int len = ‐1;           
      while((len = raf_read.read(b))!=‐1){        
             raf_write.write(b,0,len);     
                if(file.length()>chunkSize){         
                break;         
            }      
           }      
           raf_write.close();    
         }      
     }       
  raf_read.close();   
    }
[/mw_shl_code]