上传文件: procedure TOnlineUpdateFrm.btnUpdateFileClick(Sender: TObject); var sFileName:string;//sUPDATE_DATE,sFILE_SAVE flStream:TFileStream; s:string; iSumReadCount,iReadSize:integer; lst:Tstringlist; i,fileID:integer; begin sFileName:=edt_FILE_PATH_NAME.Field.AsString; //FileXieGang if not fileexists(sFileName) then exit; try flStream:=TFileStream.Create(sFileName, fmOpenRead); lst:=Tstringlist.Create; with flStream do begin //将文件分解读入缓冲 iSumReadCount:=0; while iSumReadCount<size do begin iReadSize:=size-iSumReadCount; if iReadSize> subFileSize then iReadSize:=subFileSize; s:=''; setlength(s,iReadSize); Read(pointer(@s[1])^, iReadSize); lst.Add(s); iSumReadCount:=iSumReadCount+iReadSize; end; end; fileID:=edtFileID.Field.AsInteger; try dbLsdcrm.StartTransaction; //提交文件大小日期等信息 tb_file.Edit; tb_fileFILE_SIZE.AsInteger:=flStream.size; tb_fileUPDATE_DATE.Value:=now; tb_file.Post; //清除文件内容 dbLsdcrm.Execute(format('delete from tb_subfile where program_id=%d and file_id=%d',[programid,fileid])); //增加文件内容 with tb_SubFile do begin close; open; for i:=0 to lst.Count-1 do begin Append; fieldbyname('program_id').AsInteger:=programid; fieldbyname('file_id').AsInteger:=fileid; fieldbyname('sub_id').AsInteger:=i; fieldbyname('file_save').AsString:=lst[i]; post; end; close; end; dbLsdcrm.Commit; showmessage(format('ok,%d byte read.',[iSumReadCount])); except on e:exception do begin dbLsdcrm.Rollback; showmessage(e.Message); end; end; finally flStream.Free; lst.Free; end;end;
文件下载: procedure TOnlineUpdateFrm.btnDownLoadFileClick(Sender: TObject); var //Bs:TClientBlobStream; myStream:TFileStream; sFileName,s:string; buffer,pchrHex:pchar; isize:integer; FileHandle:integer; fileid,programid:integer; begin with SaveDialog1 do if Execute then with tb_SubFile do begin close; isize:=tb_fileFILE_SIZE.AsInteger; programid:= tb_filePROGRAM_ID.AsInteger; fileid:=tb_fileFILE_ID.AsInteger; Filter:=format('program_id=%d and file_id=%d',[programid,fileid]); Filtered:=true; open; //tb_SubFileFILE_SAVE.SaveToFile('c:\test.exe'); //s:=''; //s:=fieldbyname('file_save').AsString; while not eof do begin s:=s+fieldbyname('file_save').AsString; next; end; FileHandle := FileCreate(FileName); FileWrite(FileHandle,s[1],isize); FileClose(FileHandle); end;end;
我的思路:
上传:将文件转换为字符串,1M1M地写入MYSQL;
下载:1M1M读出字符串,连接后保存为目标文件。
结果非常成功。下面我贴出代码示例:
procedure TOnlineUpdateFrm.btnUpdateFileClick(Sender: TObject);
var
sFileName:string;//sUPDATE_DATE,sFILE_SAVE
flStream:TFileStream;
s:string;
iSumReadCount,iReadSize:integer;
lst:Tstringlist;
i,fileID:integer;
begin
sFileName:=edt_FILE_PATH_NAME.Field.AsString; //FileXieGang
if not fileexists(sFileName) then
exit; try
flStream:=TFileStream.Create(sFileName, fmOpenRead);
lst:=Tstringlist.Create;
with flStream do
begin
//将文件分解读入缓冲
iSumReadCount:=0;
while iSumReadCount<size do
begin
iReadSize:=size-iSumReadCount;
if iReadSize> subFileSize then
iReadSize:=subFileSize;
s:='';
setlength(s,iReadSize);
Read(pointer(@s[1])^, iReadSize);
lst.Add(s);
iSumReadCount:=iSumReadCount+iReadSize;
end;
end; fileID:=edtFileID.Field.AsInteger;
try
dbLsdcrm.StartTransaction;
//提交文件大小日期等信息
tb_file.Edit;
tb_fileFILE_SIZE.AsInteger:=flStream.size;
tb_fileUPDATE_DATE.Value:=now;
tb_file.Post;
//清除文件内容
dbLsdcrm.Execute(format('delete from tb_subfile where program_id=%d and file_id=%d',[programid,fileid]));
//增加文件内容
with tb_SubFile do
begin
close;
open;
for i:=0 to lst.Count-1 do
begin
Append;
fieldbyname('program_id').AsInteger:=programid;
fieldbyname('file_id').AsInteger:=fileid;
fieldbyname('sub_id').AsInteger:=i;
fieldbyname('file_save').AsString:=lst[i];
post;
end;
close;
end; dbLsdcrm.Commit; showmessage(format('ok,%d byte read.',[iSumReadCount])); except on e:exception do
begin
dbLsdcrm.Rollback;
showmessage(e.Message);
end; end; finally
flStream.Free;
lst.Free;
end;end;
procedure TOnlineUpdateFrm.btnDownLoadFileClick(Sender: TObject);
var
//Bs:TClientBlobStream;
myStream:TFileStream;
sFileName,s:string;
buffer,pchrHex:pchar;
isize:integer;
FileHandle:integer; fileid,programid:integer;
begin
with SaveDialog1 do
if Execute then
with tb_SubFile do
begin
close;
isize:=tb_fileFILE_SIZE.AsInteger;
programid:= tb_filePROGRAM_ID.AsInteger;
fileid:=tb_fileFILE_ID.AsInteger; Filter:=format('program_id=%d and file_id=%d',[programid,fileid]);
Filtered:=true;
open;
//tb_SubFileFILE_SAVE.SaveToFile('c:\test.exe');
//s:='';
//s:=fieldbyname('file_save').AsString;
while not eof do
begin
s:=s+fieldbyname('file_save').AsString;
next;
end; FileHandle := FileCreate(FileName);
FileWrite(FileHandle,s[1],isize);
FileClose(FileHandle);
end;end;