C/S方式,上传、更新等待事件长会出现程序假死(没有响应),改如何解决(100)

  • 主题发起人 主题发起人 onyliu
  • 开始时间 开始时间
O

onyliu

Unregistered / Unconfirmed
GUEST, unregistred user!
上传到数据库 blob字段 下载从数据库 blob字段 用TFileStream保存由于文件在10M左右 上传、更新的时候都会出现 未响应下载------------------------- try if Count = 0 then begin BlobStream.Position := 0; Count := BlobStream.Size; end; if Count > MaxBufSize then BufSize := MaxBufSize else BufSize := Count; GetMem(Buffer, BufSize); vProgressBar.Position := 0; vProgressBar.Max := count div bufsize;//每次写入文件的数据流大小为bufsize,所以max为count 除以 bufsize try while Count <> 0 do begin if Count > BufSize then N := BufSize else N := Count; BlobStream.ReadBuffer(Buffer^, N);//从数据库表中取数据流 FileStream.WriteBuffer(Buffer^, N);//将数据流写入文件 Dec(Count, N); vLable.Caption := '下载文件进度 :'+ IntToStr(vProgressBar.Position) + '%' + ' 可能需要几分钟,请稍等...'; vProgressBar.Position := vProgressBar.Position + 1; Application.ProcessMessages; end; finally FreeMem(Buffer, BufSize); end; finally BlobStream.Free; end; 上传---------------------------- try Stream := vQuery.CreateBlobStream(vQuery.FieldByName(FieldBlobName), bmWrite); GetMem(Buffer, BufSize); try vLabel.Caption := '准备读取文件...'; Count := FileStream.Size; vProgressBar.Position := 0; while Count <> 0 do begin if Count > BufSize then N := BufSize else N := Count; FileStream.ReadBuffer(Buffer^, N); Stream.WriteBuffer(Buffer^, N); Dec(Count, N); vLabel.Caption := '读取文件进度: '+ IntToStr(vProgressBar.Position) +' %'; vProgressBar.Position := vProgressBar.Position + 1; end; finally FreeMem(Buffer, BufSize); Stream.Free; end; Application.ProcessMessages; vLabel.Caption := '读取文件成功,正在上传文件,可能需要几分钟,请稍等...'; Application.ProcessMessages; vQuery.applyupdates; vQuery.commitupdates; finally vProgressBar.Position := vProgressBar.Max; FileStream.Free; vQuery.Close; end;
 
其实10M的文件并不算大,我们的系统里会存在单个上百兆文件的上传下载,下面有两个建议希望能帮到你:1.把大文件存到数据库,数据库负担太重。建议使用ftp等方式2.使用多线程,用户可以在上传过程处理其他的工作
 
由于文件在10M左右。=========你将它们存入数据库,那么请耐心等待噩梦到来的那一天。
 
用快驴,更简单:1、上传文件//// 开始传输...procedure TForm1.Button2Click(Sender: TObject);begin if edit1.text='' then begin application.MessageBox('请先选择要上传的文件!','操作提示',mb_ok+mb_iconinformation); exit; end; if syncburro1.WriteRemoteFile(qbconnection1.NodeId,edit1.Text,'c:/'+extractfilename(edit1.Text),5) then application.MessageBox('指定的文件已经上传到服务器的C:/下!','上传成功',mb_ok+mb_iconinformation) else application.MessageBox('上传失败!','错误信息',mb_ok+mb_iconerror);end;//// 传输进度...procedure TForm1.SyncBurro1FileWriteProgress(Sender: TObject; AllBlocks, CurrentBlock: Integer);begin progressbar1.Max:=allblocks; progressbar1.Position:=currentblock;end;2、下载文件://// 开始下载...procedure TForm1.Button2Click(Sender: TObject);begin if edit1.text='' then begin application.MessageBox('请先指定要下载的文件!','操作提示',mb_ok+mb_iconinformation); exit; end; if syncburro1.ReadRemoteFile(qbconnection1.NodeId,edit1.Text,'c:/'+extractfilename(edit1.Text),5) then application.MessageBox('指定的文件已经下载到本地的C:/下!','下载成功',mb_ok+mb_iconinformation) else application.MessageBox('下载失败!','错误信息',mb_ok+mb_iconerror);end;//// 下载进度...procedure TForm1.SyncBurro1FileReadProgress(Sender: TObject; AllBlocks, CurrentBlock: Integer);begin progressbar1.Max:=allblocks; progressbar1.Position:=currentblock;end;采用分块并发传输,服务粒度小,消息响应及时,并可断点续传!
 
楼上的 快驴 是控件还是什么,传给我份 立马给分结贴
 
是传到数据库的麽?暂时不考虑FTP的方式,一会试下多线程
 
哦,快驴是一套for delphi的中间件,多层分布式开发平台。详情请浏览: http://www.quickburro.com/
 
后退
顶部