【问题标题】:why is my program not uploading file on remote ftp server?为什么我的程序没有在远程 ftp 服务器上上传文件?
【发布时间】:2009-09-04 16:33:20
【问题描述】:

我编写了这个程序以使用 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.

【问题讨论】:

  • 已经有“loggen.txt”了吗?尝试先将其删除。
  • 检查服务器名称'ftp.drivehq.com',有空格。
  • 你的意思是有空格我是一个编程新手请解释一下
  • 尝试将 remote_server := 'ftp.drivehq.com' 更改为 remote_server := 'ftp.drivehq.com'
  • 是的,RRUZ 你说得对!!!这是一个错误不能相信我犯了一个明显的错误!

标签: delphi api ftp wininet


【解决方案1】:

检查FtpPutFile 的返回值(成功时应返回TRUE)并通过GetLastError 获取详细错误。

【讨论】:

    【解决方案2】:

    您为什么不更加努力地通过测试所有返回码来确定它失败的地方?

    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.
    

    【讨论】:

    • 如果不是 ftpPutFile(hConnect, local_file, remote_file, FTP_TRANSFER_TYPE_BINARY, 0) 然后 RaiseLastOSError; 则返回错误代码 12002我用谷歌搜索了这个错误代码,它的意思是“请求已超时”。和“ERROR_INTERNET_TIMEOUT”请帮忙!!!对不起,我忘了提到我是编程新手
    • @Omair - 如果您遇到超时错误,请尝试我的答案中列出的方法,以检查您的系统和 FTP 站点是否可以首先交换信息 - 问题可能不在您的这样的代码[尽管您应该编写代码来正确处理这些错误。 :-)]
    【解决方案3】:

    首先,通过检查您是否可以使用 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 代码之前解决这个问题。

     

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

    【讨论】:

    • 我尝试使用 C:\Documents and Settings\Omair\Desktop\loggen.txt 以及 C:\Documents and Settings\Omair\Desktop\loggen.txt [/loggen.txt] microsft 命令行 ftp 失败!!这是否意味着我的 windows ftp 有问题,而且我曾经一遍又一遍地调整我的 delphi 代码,它不小心上传了它我不记得我做了什么上传它,因为我经常试验
    • 复制文件到 C:\ 驱动器的根目录,确保它的只读属性没有设置,启动命令提示符,cd 到你的 c:\ 驱动器和 FTP 的根目录那里。从 FTP 服务器中删除任何现有的 loggen.txt(我认为是“del loggen.txt”,目前没有 Windows 机器方便!)。文件名中不需要任何文件路径,因为您从文件所在的根目录开始,所以只需使用 loggen.txt 作为文件名。现在,看看会发生什么……?祝你好运!
    • 嘿,我的代码现在可以运行了,谢谢!看来我的错误是我使用了空白空间,即“ftp.drivehq.com”而不是“ftp.drivehq.com”,我不能相信我犯了这么明显的错误!
    • 还有一个问题:使用上面的 ftpputfile 等直接 api 函数时,在性能方面有什么优势吗?我的意思是如果我使用组件、indy、synapce 库等会使我的代码变慢吗?
    • Omair - 在我的经验中没有太大的优势。你从这些组件中得到的东西将是很好的错误捕获和状态处理、加密和安全连接之类的选项——这些都是好东西,而且通常值得包含(特别是如果你正在构建一些商业产品)。但是,如果您要做的只是从 A 到 B 获取文件,并且您不会被 WinInet API 吓跑,那么我会按原样使用它。我不得不说,从您上面的一些其他 cmets 和要点来看,使用 FTP 组件可能会为您提供更好的服务,该组件将为您捕获并触发“错误”事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 2014-04-07
    • 2016-02-08
    • 2020-11-25
    • 1970-01-01
    • 2013-06-20
    相关资源
    最近更新 更多