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;我想在上传和下载时用一个进度条提示已完成的百分比是多少,请帮忙
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;我想在上传和下载时用一个进度条提示已完成的百分比是多少,请帮忙
先看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;
有帮主看到没有?加到FAQ中吧。
看来我有戏加点“性欲”分,哈哈~~~
嘿嘿~~~好象完成得不错!
有帮主看到没有?加到FAQ中吧。
看来我有戏加点“性欲”分,哈哈~~~
==========================================
自卖自夸呵呵
哈哈~~~有人要吐了
这一句不要了吧?如果有这一句会报错哦
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;