在此多谢CSDN上一些兄弟的帮助,我才可以实现这个功能....上传文件到数据库:procedure Tw_main.SpeedButton_upClick(Sender: TObject);
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;
size_tmp := exeFilestream.Size; ProgressBar_up.Position := 0;
ProgressBar_up.Max := Counter div BufSize;//每次上传文件流为61440 byte = $F000
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);
finally
ProgressBar_up.Position := ProgressBar_up.Max;
exeFilestream.Free;
end;
finally
begin
// exeFilestream.Free;
// MessageBox(Handle,pchar('文件打开失败!'),'提示',MB_ICONEXCLAMATION);
end;
end;
end;
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;
size_tmp := exeFilestream.Size; ProgressBar_up.Position := 0;
ProgressBar_up.Max := Counter div BufSize;//每次上传文件流为61440 byte = $F000
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);
finally
ProgressBar_up.Position := ProgressBar_up.Max;
exeFilestream.Free;
end;
finally
begin
// exeFilestream.Free;
// MessageBox(Handle,pchar('文件打开失败!'),'提示',MB_ICONEXCLAMATION);
end;
end;
end;
解决方案 »
- 菜鸟请教2个通讯问题 请高手指导指导 谢谢!!
- =============寻求一个解决方案===============
- 如何捕获系统异常
- 兄弟们,帮帮忙吧!!快气死我啦!
- 请教各位,有谁知道QRCompositeReport怎么用的?(在线等...)
- 请教一个的问题,在一个单元中能否建立两个或两个以上的类??
- 关于FTP下载的有关问题?
- 我生成了几幅图像,放在panel上,现想实现点击其中一幅就能显示在另一个panel上。请问谁有好的办法???
- 如何查询一段时间的记录?
- 哪有Mircosof Html Workshop下载!
- 我在dll中创建一个TAdoDataSet老是提示尚未调用CoInitialize,怎么办?
- [急] 在Dll中输出包含Interface的自定义VCL组件
var
myfilename:string;//保存文件的路径和文件名
myfileStream,exeBlobStream: TStream;
Count,BufSize, N: Integer;
Buffer: PChar;
const
MaxBufSize = $F000;
begin
timer_down.Enabled := false;
with w_main.adoquery_ZXSJ do
begin
close;sql.Clear;
sql.Add('select * from ZXSJ');
open;
myfilename := ExtractFilePath(Application.ExeName) + fieldbyname('appname_zxsj').AsString;//获得文件的完整路径
// TBlobField(FieldByName('filestream_ZXSJ')).SaveToFile(fieldbyname('appname_zxsj').AsString);
myfileStream := TFileStream.Create(myfilename, fmCreate);//创建文件
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
try //SaveToStream(Stream);
exeBlobStream := ADOQuery_ZXSJ.CreateBlobStream(FieldByName('filestream_ZXSJ'), bmRead);//从数据库中取得记录
Count := 0;
try
if Count = 0 then
begin
exeBlobStream.Position := 0;
Count := exeBlobStream.Size;//showmessage(inttostr(count));
end;
if Count > MaxBufSize then BufSize := MaxBufSize else BufSize := Count;
GetMem(Buffer, BufSize); ProgressBar_down.Position := 0;
ProgressBar_down.Max := count div bufsize;//每次写入文件的数据流大小为bufsize,所以max为count 除以 bufsize
try
while Count <> 0 do
begin
if Count > BufSize then N := BufSize else N := Count;
exeBlobStream.ReadBuffer(Buffer^, N);//从数据库表中取数据流
MyFileStream.WriteBuffer(Buffer^, N);//将数据流写入文件
Dec(Count, N);
ProgressBar_down.Position := ProgressBar_down.Position + 1;
end;
finally
FreeMem(Buffer, BufSize);
end;
finally
exeBlobStream.Free;
end;
finally
myfileStream.Free;
end;
end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// TBlobField(FieldByName('filestream_ZXSJ')).SaveToFile(fieldbyname('appname_zxsj').AsString);
myini.WriteString('system','version',g_version_sql);//将新版本号写入ini
MessageBox(Handle,pchar('软件升级完成!'),'信息',MB_ICONINFORMATION);
winexec(pchar(ExtractFilePath(Application.ExeName)+i_exename),SW_SHOWNORMAL);
application.ShowMainForm:=false;
application.Terminate;
end;
1.将EXE文件上传保存到数据库,字段为IMAGE类型,保存有:文件名,文件大小,文件版本号,上传日期,备注
2.文件版本号主要用来和ini文件中的旧版本进行比较,如果大于旧版本就下载,不大于就不下载下载文件:
1.发现数据库中的版本号大于INI文件中的版本号,就开始下载
2.下载完后将数据库中的版本号写入INI文件中,做为升级后的版本号
3.下载完后通过winexec(pchar(ExtractFilePath(Application.ExeName)+i_exename),SW_SHOWNORMAL);开始运行主程序