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

Posted

技术标签:

【中文标题】为啥我的程序没有在远程 ftp 服务器上上传文件?【英文标题】: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 你说得对!!!这是一个错误不能相信我犯了一个明显的错误! 【参考方案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 组件可能会为您提供更好的服务,该组件将为您捕获并触发“错误”事件。

以上是关于为啥我的程序没有在远程 ftp 服务器上上传文件?的主要内容,如果未能解决你的问题,请参考以下文章

将文件发送到远程 FTP 服务器

怎么将文件上传到一个web服务器??

为啥手机浏览器不能访问ftp

如何将http上的文件远程上传到ftp空间里?

是否可以使用Git扩展或Git GUI来管理远程linux ftp服务器上的文件,如本地存储库

http上传下载和ftp上传下载的原理一样吗?有啥差别?