为什么我的程序没有在远程ftp服务器上传文件?

时间:2009-09-04 16:33:21

标签: delphi api ftp wininet

我编写了这个程序,使用ftpput api在服务器上上传文件但是它运行不正常,但文件没有被删除!

这是代码:

unit ftp3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,wininet;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);

       var hInet, hConnect: HINTERNET; 

    local_file, 
    remote_file,
    user,remote_server,
    pass: pchar;

    begin 
    local_file := 'C:\Documents and Settings\Omair\Desktop\loggen.txt';
    remote_file := 'loggen.txt';
    user := 'my user';
    pass := 'my pass';
    remote_server := ' ftp.drivehq.com';

    hInet := InternetOpen(0, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);
    hConnect := InternetConnect(hInet,
        remote_server, 
        INTERNET_DEFAULT_FTP_PORT,
        user, pass,
        INTERNET_SERVICE_FTP,
        INTERNET_FLAG_PASSIVE,
        0);

    ftpPutFile(hConnect, local_file, remote_file, FTP_TRANSFER_TYPE_BINARY, 0);

    InternetCloseHandle(hInet);
    InternetCloseHandle(hConnect);

    end;   

  end.

3 个答案:

答案 0 :(得分:4)

检查FtpPutFile的返回值(成功时应返回TRUE),并在GetLastError时收到详细错误。

答案 1 :(得分:4)

为什么不尝试通过测试所有返回代码来确定发生了什么,以确定它失败的位置?

procedure TForm1.Button1Click(Sender: TObject);
var
  hInet, hConnect: HINTERNET;
  local_file, remote_file, user,remote_server, pass: PChar;
begin
  local_file := 'C:\Documents and Settings\Omair\Desktop\loggen.txt';
  remote_file := 'loggen.txt';
  user := 'my user';
  pass := 'my pass';
  remote_server := ' ftp.drivehq.com';

  hInet := InternetOpen(0, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);
  if hInet = nil then
    RaiseLastOSError;

  hConnect := InternetConnect(hInet,
    remote_server,
    INTERNET_DEFAULT_FTP_PORT,
    user, pass,
    INTERNET_SERVICE_FTP,
    INTERNET_FLAG_PASSIVE,
    0);
  if hConnect = nil then
    RaiseLastOSError;

  if not ftpPutFile(hConnect, local_file, remote_file, FTP_TRANSFER_TYPE_BINARY, 0) then
    RaiseLastOSError;

  if not InternetCloseHandle(hConnect) then
    RaiseLastOSError;
  if not InternetCloseHandle(hInet) then
    RaiseLastOSError;
end;

在尝试发送文件之前,你甚至没有知道你是否有连接 ...(正如预期的那样,当我使用这些网站/用户/密码运行代码时,我得到的是价值观)

如果你过去了,你可能会得到一个详细解释为什么ftpPutFile失败,就像在这个例子中一样:

System Error.  Code: 3.

The system cannot find the path specified.

答案 2 :(得分:2)

首先,通过检查您是否可以使用Microsoft的内置FTP程序FTP相同的文件来排除程序中的任何重大错误(或者如果您愿意,可以将它们置于规则中)。

从命令行输入

FTP ftp.drivehq.com (return)

如果这不是通过登录提示返回给您的,那么您在Delphi代码之外就会遇到问题。要么您的互联网连接有限(可能是端口25,FTP端口,被防火墙/路由器阻止),或者FTP地址本身存在问题。

如果您收到提示,请在询问时输入您的用户名和密码。现在输入

BIN (return)
PUT 'C:\Documents and Settings\Omair\Desktop\loggen.txt' (return)

如果它似乎发送你的文件,(顺便说一下,键入BYE离开FTP程序)那么你的问题是你的Delphi代码而不是FTP进程本身(这里的其他答案有助于指出你的事情)需要检查Delphi代码本身)。如果它似乎没有发送文件,我再建议你在修改Delphi代码之前解决这个问题。

当我在做任何类似的“在线”工作时,我总是试图获得一个单独的过程来测试系统的“另一端”,一个不使用我自己的代码的过程。