为啥我的程序没有在远程 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 服务器上上传文件?的主要内容,如果未能解决你的问题,请参考以下文章