怎么在服务端保存从客户端上传的文件啊?已经设置好客户端有上传的权限了。
我是在服务端的onstorefile事件中编程的,但在onstorefile的几个参数中,上传的数据在哪里呢?测试过VStream的size是0,filename是客户端上传的文件名。
麻烦告诉我该怎么做,给个简单的例子,谢谢

解决方案 »

  1.   

    我可以发一个例子给你参考。[email protected]
      

  2.   

    这是我做的程序中的事件处理过程
    procedure TMainForm.IdFTPServer1StoreFile(ASender: TIdFTPServerThread;
      const AFileName: String; AAppend: Boolean; var VStream: TStream);
    var  tempname,fname,extname:string;
         i,k:integer;
         flag:boolean;
    begin
        StatusBar1.Panels[4].Text := '开始接收客户数据...';
        fname:=extractfilename(AFilename);
        ExtName:=extractfileext(AFilename);
        flag:=true;
        k:=1;
        if FileExists(storedir+fname) then   //若文件已有同名存在,则自动编号
         begin
           for i:=1 to length(fname) do   if fname[i]='.' then k:=i;
           fname:=copy(fname,1,k-1);
           i:=0;
           while(i<1000)and flag do begin
                                 tempname:=fname+inttostr(i)+extname;
                                 if not FileExists( storedir+tempname) then flag:=false;
                                 i:=i+1;
                                     end;
         fname:=tempname+extname;
        VStream := TFileStream.create( StoreDir+Fname , fmCreate or fmShareExclusive ) ;
      end;
    end;
      

  3.   

    你自己创建一个对应于目标文件的TFileSream,然后赋值给VStream即可写Stream和Free操作由FTP组件执行.
      

  4.   

    服务器端
    procedure TSingleDLoadFm.BitBtn1Click(Sender: TObject);
    var
      RetStr: string;
      iReturn: integer;
      //SaveFStream: TFileStream;
      SaveFStream:Tmemorystream;
    begin  begin //============================================================
        Animate1.Active := True;
        Bitbtn1.Enabled := False;
        try //发送下载的文件
          DownLoadTcp.Write('文件下载' + EOL); //1-------SendfileCMD
          DownLoadTcp.Write(Edit3.Text + Edit1.Text + EOL); //2-------SendfileName
        except
          DownLoadTcp.Disconnect;
          Animate1.Active := False;
          beep;
          Self.Caption := '提示:网络信息发送失败!';
          exit;
        end;
        //TmpFName := Edit2.Text + '\' + Edit1.Text;
        TmpFName := Edit2.Text + Edit1.Text;
        //================================文件接续
        try
          if FileExists(TmpFName) then
          begin
            //SaveFStream := TFileStream.Create(TmpFName, fmOpenReadWrite);
            SaveFStream:=Tmemorystream.Create;
            AlreadyReadLen := SaveFStream.Size;
          end
          else
          begin
            //SaveFStream := TFileStream.Create(TmpFName, fmCreate);
            SaveFStream:=Tmemorystream.Create;
            AlreadyReadLen := 0;
          end;
        except
          beep;
          beep;
          Self.Caption := '错误提示:请重新指定下载目录!';
          exit;
        end;
        //===============================
        try
          DownLoadTcp.WriteInteger(AlreadyReadLen); //---send filePos文件位置
        except
          SaveFStream.free;
          Animate1.Active := False;
          DownLoadTcp.Disconnect;
          Self.Caption := '错误提示:网络信息发送失败!';
          exit;
        end;
        try
          //iReturn := DownLoadTcp.ReadInteger;
          RetStr := DownloadTcp.ReadLn(EOL);
        except
          SaveFStream.free;
          DownLoadTcp.Disconnect;
          Animate1.Active := False;
          Self.Caption := '错误提示:远程网络断开,接收失败!';
          exit;
        end;
        if RetStr = 'OK' then //------------------------读取接收标志
        begin //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          //读数据------------------------开始-----
          try
            ReadFileLen := DownLoadTcp.ReadInteger;
          except
            SaveFStream.free;
            DownLoadTcp.Disconnect;
            Animate1.Active := False;
            Self.Caption := '错误提示:远程网络断开,接收失败!';
            exit;
          end;
          SaveFStream.Position := SaveFStream.Size;
          ProgressBar1.Max := ReadFileLen + AlreadyReadLen;
          ProgressBar1.Position := 0;
          try
            DownLoadTcp.ReadStream(SaveFStream, ReadFileLen);
          except
            SaveFStream.Free;
            Animate1.Active := False;
            DownLoadTcp.Disconnect;
            Self.Caption := '错误提示:远程网络断开,接收失败!';
            exit;
          end;
          SaveFStream.SaveToFile(TmpFName);
          SaveFStream.free; //下载成功
          Bitbtn3.Enabled := True;
          beep;
          Self.Caption := '下载完毕! 共:' + IntToStr(ProgressBar1.Max) + '字节';
          ProgressBar1.Position := ProgressBar1.Max;
          Sleep(100);
          if Self.Tag = 1 then
          //  DelRemoteFile(Edit3.Text + Edit1.Text, Form1.IdFTCPClient);
          DownLoadTcp.Disconnect;
          Animate1.Active := False;
          if checkBox1.Checked then Close;
          exit;
        end; //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        DownLoadTcp.Disconnect; //
        Self.Caption := '反馈提示:远程文件定位失败,连接断开!';
        Animate1.Active := False;
        Bitbtn1.Enabled := True;
        exit;
      end; //============================================================
      beep;
      Self.Caption := '提示:网络连接失败!';
    end;
      

  5.   

    客户端
    procedure TDownLoadThread.Execute;
    var
      FromF: file of byte;
      FileLen: integer;
      NumRead, NumWritten: Integer;
      Buf: array[1..32768] of Char;
      tmStr:Tmemorystream;
    begin
      Synchronize(RegisteLog);
      try
        AssignFile(FromF, TheFileName);
        FileMode := 0;
        Reset(FromF);
        Seek(FromF, ThePosition);
      except
        try
          CloseFile(FromF);
        except
        end;
        Self.Terminate;
        exit;
      end;
      try
        FileLen := FileSize(FromF);
        SysThread.Connection.WriteInteger(FileLen - ThePosition);
      except
        CloseFile(FromF);
        Self.Terminate;
        exit;
      end;
      tmStr:=Tmemorystream.Create;
      tmStr.LoadFromFile(TheFileName);
       SysThread.Connection.OpenWriteBuffer;
       SysThread.Connection.WriteStream(tmStr,true,false,0);
       SysThread.Connection.CloseWriteBuffer;
       tmStr.Free;
    {
      repeat
        try
          SysThread.Connection.OpenWriteBuffer;
          BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
          SysThread.Connection.WriteBuffer(Buf, NumRead);
          SysThread.Connection.CloseWriteBuffer;
        except
          CloseFile(FromF);
          exit;
        end;
      until (NumRead = 0);     }
      CloseFile(FromF);
      //SysThread.Connection.Disconnect;
      self.Terminate;
    end;