wcf 利用二进制流 异步上传文件

 [OperationContract]
      
public   void  DoUpload( string  fileName,  byte [] context,  bool  append)
      {
          
// 上传目录
           string  folder  =  System.Web.Hosting.HostingEnvironment.MapPath( " ~/upload " );
          
if  ( ! System.IO.Directory.Exists(folder))
          {
              
// 如果上传目录不存在则新建一个
              System.IO.Directory.CreateDirectory(folder);
          }
          
// 文件读写模式
          FileMode m  =  FileMode.Create;
          
if  (append)
          {
              
// 如果参数为true则表示续传,以追加模式操作文件
              m  =  FileMode.Append;
          }
 
          
// 写文件操作
           using  (FileStream fs  =   new  FileStream(folder  +   @" \ "   +  fileName, m, FileAccess.Write))
          {
              fs.Write(context, 
0 , context.Length);
          }
          
return ;
    }


 
void  uploader_DoUploadCompleted( object  sender, System.ComponentModel.AsyncCompletedEventArgs e)
      {
          
if  (e.Error  ==   null )
          {
              
// 上一个包上传成功
              uploadfile file  =  e.UserState  as  uploadfile;
              
// 修改已上传大小(显示作用)
              file.sent  +=  file.context[ 0 ].Length  /   1000 ;
              
// 删除已上传内容
              file.context.RemoveAt( 0 );
              
    //显示进度
    bt.Content = file.sent.ToString() + "/" + file.size.ToString();      
    textblack1.Content = (Math.Round(100 * (Math.Round(file.sent / 1024, 0) / Math.Round(file.size / 1024, 0)), 1)).ToString() + "%";
        //如果上传内容是空,完成操作
    if  (file.context.Count  ==   0 )
              {
                  bt.Content 
=   " upload " ;
                  MessageBox.Show(
" upload OK " );
              }
              
else
              {
                  
// 如果上传内容不是空,则继续剩余下一段内容上传
                  (sender  as  ServiceReference1.uploadServiceClient).DoUploadAsync(file.name, file.context[ 0 ],  true , file);
                  

              }
          }
      }
  }

  
public   class  uploadfile
 {
     
// 文件名
      public   string  name {  get set ; }
     
// 文件大小
       public   double  size {  get set ; }
     
// 已上传
       public   double  sent {  get set ; }
     
// 上传内容
       public  List < byte [] >  context {  get set ; }
 }


 
// 点击事件
      void  bt_Click( object  sender, RoutedEventArgs e)
     {
          
// 选择本地文件对话框
          OpenFileDialog d  =   new  OpenFileDialog();
          
// 文件过滤
          d.Filter  =   " (*.*)|*.* " ;
          
// 只能选单个文件
          d.Multiselect  =   false ;
          
// 选择完成
           if  (d.ShowDialog()  ==   true )
          {
              
// 文件信消
              FileInfo f  =  d.File;
              
// 新实例化一个文件从uploadfile类
              uploadfile file  =   new  uploadfile();
              
// 文件名
              file.name  =  f.Name;
              
// 文件流内容
              Stream s  =  f.OpenRead();
              
// 文件大小(/1000是为了方便查看,成为k为单位)
              file.size  =  s.Length  /   1000 ;
              
// 实例file的内容
              file.context  =   new  List < byte [] > ();
 
              
// 这里读取指定大小的文件流内容到file.context准备上传
               int  b;
              
while  (s.Position  >   - 1   &&  s.Position  <  s.Length)
              {
                  
if  (s.Length  -  s.Position  >=   3000 )
                  {
                      b 
=   3000 ;
                  }
                  
else
                   {
                       b 
=  ( int )(s.Length  -  s.Position);
                  }
  
                   
byte [] filebyte  =   new   byte [b];
                   s.Read(filebyte, 
0 , b);
                   file.context.Add(filebyte);
               }
              s.Close();
  
               
// 实例化wcf客户端
               ServiceReference1.uploadServiceClient uploader  =   new  uploadFile.ServiceReference1.uploadServiceClient();
               
// 注册DoUpload完成事件
               uploader.DoUploadCompleted  +=   new  EventHandler < System.ComponentModel.AsyncCompletedEventArgs > (uploader_DoUploadCompleted);
               
// 开始第一个包的上传
               uploader.DoUploadAsync(file.name, file.context[ 0 ],  false , file);
           }
      }

转载于:https://www.cnblogs.com/infim/archive/2011/02/25/1964589.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值