0

我对这个程序进行了编码,以使用 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.
4

3 回答 3

4

检查返回值FtpPutFile(它应该TRUE在成功时返回)并使用GetLastError.

于 2009-09-04T16:43:01.233 回答
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.
于 2009-09-04T19:05:02.943 回答
2

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

在命令行中,键入

FTP ftp.drivehq.com(返回)

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

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

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

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

 

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

于 2009-09-05T07:44:04.323 回答