你试试用longblob类型来存储吧,这么大的文件一般不会直接存到数据库,只存它的路径会好点

解决方案 »

  1.   

    MYSQL服务器端默认的接收缓存是1M,虽然可以调整,但我还是选择了文件切割方法。
    我的思路:
    上传:将文件转换为字符串,1M1M地写入MYSQL;
    下载:1M1M读出字符串,连接后保存为目标文件。
    结果非常成功。下面我贴出代码示例:
      

  2.   

    上传文件:
    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;
      

  3.   

    文件下载:
    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;
      

  4.   

    MYSQL在不同的操作系统上的话有些编程受限制