procedure TForm1.Button1Click(Sender: TObject);
var rmFilestream:Tfilestream;
begin
rmFilestream:=TFileStream.Create('d:\2.exe',fmopenRead);
rmFilestream.Position:=0;
try
 with adoquery1 do
 begin
   edit;
   TBlobField(FieldByName('c_blob')).loadfromStream(rmFilestream);///保存到库里
   post;
 end;
finally
rmFilestream.Free;
end;
end;procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 with adoquery1 do
 begin
   TBlobField(adoquery1.FieldByName('c_blob')).SaveToFile('e:\2.exe');
 end;
end;我想在上传和下载时用一个进度条提示已完成的百分比是多少,请帮忙

解决方案 »

  1.   

    我们还是看看VCL的代码吧,这样问题就比较好解决了
    先看TBlobField(FieldByName('c_blob')).loadfromStream(rmFilestream)在Delphi中到底作了哪些事情,其代码如下:
    procedure TBlobField.LoadFromStream(Stream: TStream);
    begin
      with DataSet.CreateBlobStream(Self, bmWrite) do
      try
        CopyFrom(Stream, 0);
      finally
        Free;
      end;
    end;
    DataSet.CreateBlobStream(Self, bmWrite)返回的是一个TStream对象,我们再看CopyFrom方法:
    function TStream.CopyFrom(Source: TStream; Count: Int64): Int64;
    const
      MaxBufSize = $F000;
    var
      BufSize, N: Integer;
      Buffer: PChar;
    begin
      if Count = 0 then
      begin
        Source.Position := 0;
        Count := Source.Size;
      end;
      Result := Count;
      if Count > MaxBufSize then BufSize := MaxBufSize else BufSize := Count;
      GetMem(Buffer, BufSize);
      try
        {--Begin of Loop--}
        while Count <> 0 do
        begin
          if Count > BufSize then N := BufSize else N := Count;
          Source.ReadBuffer(Buffer^, N);
          WriteBuffer(Buffer^, N);
          Dec(Count, N);
        end;
        {--End of Loop--}
      finally
        FreeMem(Buffer, BufSize);
      end;
    end;
    从上面代码就可以知道,其实CopyFrom也是一个Buf一个Buf来考数据的,所以问题就比较好解决了,我们自己写(其实是抄!呵呵呵~~~)以上的代码就OK了,把进度处理嵌到Loop中就可以达到效果了:) 下面是我写的一个例子,存入数据库的,存出你就可以仿着作出来了!
    procedure TForm1.Button1Click(Sender: TObject);
    const
      BufSize = $F000;
    var
      Counter, N: Integer;
      Buffer: PAnsiChar;
      FieldStrm: TStream;
      rmFilestream:Tfilestream;
    begin
      rmFilestream:=TFileStream.Create('d:\2.exe',fmopenRead);
      try
        ADOQuery1.Edit;
        TBlobField(ADOQuery1.FieldByName('c_blob')).LoadFromStream();
        FieldStrm := ADOQuery1.CreateBlobStream(ADOQuery1.FieldByName('c_blob'), bmWrite);
        GetMem(Buffer, BufSize);
        try
          Counter := rmFilestream.Size;      ProgressBar1.Position := 0;
          ProgressBar1.Max := Counter div BufSize;      while Counter <> 0 do
          begin
            if Counter > BufSize then
              N := BufSize
            else
              N := Counter;
            rmFilestream.ReadBuffer(Buffer^, N);
            FieldStrm.WriteBuffer(Buffer^, N);
            Dec(Counter, N);
            ProgressBar1.Position := ProgressBar1.Position + 1;
            Application.ProcessMessages;
          end;
        finally
          FreeMem(Buffer, BufSize);
          FieldStrm.Free;
        end;
        ADOQuery1.Post;
      finally
        ProgressBar1.Position := ProgressBar1.Max;
        rmFilestream.Free;
      end;
    end;
      

  2.   

    嘿嘿~~~好象完成得不错!
    有帮主看到没有?加到FAQ中吧。
    看来我有戏加点“性欲”分,哈哈~~~
      

  3.   

    To: blazingfire(烈焰)(对.net极度憎恨中....)
     
     
       嘿嘿~~~好象完成得不错!
    有帮主看到没有?加到FAQ中吧。
    看来我有戏加点“性欲”分,哈哈~~~
    ==========================================
    自卖自夸呵呵
      
     
      

  4.   

    hsmserver(小霍) :
    哈哈~~~有人要吐了
      

  5.   

    TBlobField(ADOQuery1.FieldByName('c_blob')).LoadFromStream();
    这一句不要了吧?如果有这一句会报错哦
      

  6.   

    我是这样写的,当进度条到了100%时,过了5秒钟,才会提示上传完成const
      BufSize = $F000;
    var
      Counter, N: Integer;
      Buffer: PAnsiChar;
      FieldStrm: TStream;
      exeFilestream:Tfilestream;
    begin
      if  (edit_filepath.Text='') or (edit_ver_new.Text='') then
        MessageBox(Handle,pchar('文件路径和文件名不能为空,或版本号输入不正确!'),'提示',MB_ICONEXCLAMATION)
      else
        with ADOQuery_zxsj do
          try
            exeFilestream:=TFileStream.Create(edit_filepath.Text,fmopenRead);//打开文件
            if MessageBox(Handle,pchar('确认要将 ['+edit_filepath.Text+'] 的文件版本设置为 ['+edit_ver_new.Text+'] 并上传到服务器?'),'系统提示',MB_YESNO OR MB_ICONQUESTION or MB_DEFBUTTON2)=IDYES then
              try
                edit;
    //            TBlobField(FieldByName('filestream_ZXSJ')).loadfromStream(exeFilestream);///保存到库里
                FieldStrm := adoquery_zxsj.CreateBlobStream(adoquery_zxsj.FieldByName('filestream_ZXSJ'), bmWrite);
                GetMem(Buffer, BufSize);
                try
                  Counter := exeFilestream.Size;
                  ProgressBar_up.Position := 0;
                  ProgressBar_up.Max := Counter div BufSize;
                  while Counter <> 0 do
                    begin
                      if Counter > BufSize then
                        N := BufSize
                      else
                        N := Counter;
                      exeFilestream.ReadBuffer(Buffer^, N);
                      FieldStrm.WriteBuffer(Buffer^, N);
                      Dec(Counter, N);
                      ProgressBar_up.Position := ProgressBar_up.Position + 1;
                      Application.ProcessMessages;
                    end;
                finally
                  FreeMem(Buffer, BufSize);
                  FieldStrm.Free;
                end;
                fieldbyname('appname_ZXSJ').AsString:=file_tmp;
                fieldbyname('version_ZXSJ').AsString:=edit_ver_new.text;
                fieldbyname('size_ZXSJ').AsFloat:=size_tmp;
                fieldbyname('update_ZXSJ').AsDateTime:=now();
                fieldbyname('re_ZXSJ').AsString:=memo_re_new.text;
                post;
                MessageBox(Handle,pchar('文件上传成功!'),'信息',MB_ICONINFORMATION);
    //            exeFilestream.Free;
              finally
                ProgressBar_up.Position := ProgressBar_up.Max;
                exeFilestream.Free;
              end;
          finally
            begin
      //        exeFilestream.Free;
      //        MessageBox(Handle,pchar('文件打开失败!'),'提示',MB_ICONEXCLAMATION);
            end;
          end;
    end;
      

  7.   

    从数据库中的取得image字段的数据,可以保存为指定文件,但为什么文件的大小为0字节? http://community.csdn.net/Expert/topic/3363/3363807.xml?temp=.3503229