【问题标题】:Why doesn't Perl's Net::FTP upload my file?为什么 Perl 的 Net::FTP 不上传我的文件?
【发布时间】:2013-03-15 03:22:27
【问题描述】:

我正在尝试通过Net::FTP 和 Perl 上传多个文件。有没有人这样做,因为我下面的基本脚本也失败了?

use Net::FTP;
use File::Basename;

my $ftp;
my $host ='56.309.24.2';
my $user ='user';
my $pw   ='pass';

my $file ='097360718843.jpeg';
my $path ='public_html/uploaded/product_images';

chomp($host,$user,$pw,$path, $file);

$ftp=Net::FTP->new($host) or die "could not login";
$ftp->login($user,$pw) or die "could not login";
$ftp->cwd($path) or die "could not cwd $path";
$ftp->ls;
$ftp->put($file) or die "could not put $file";
$ftp->site("chmod 600 " . basename($file));

这是转移日志:

Net::FTP>>> 
Net::FTP(2.75) 
Net::FTP>>> Exporter(5.58) 
Net::FTP>>> 
Net::Cmd(2.26) 
Net::FTP>>> IO::Socket::INET(1.27) 
Net::FTP>>> IO::Socket(1.28) 
Net::FTP>>> IO::Handle(1.24) 
Net::FTP=GLOB(0x180c6a8)<<< 220---------- Welcome to Pure-FTPd [TLS] ---------- 
Net::FTP=GLOB(0x180c6a8)<<< 220-You are user number 1 of 50 allowed. 
Net::FTP=GLOB(0x180c6a8)<<< 220-Local time is now 16:19. Server port: 21. 
Net::FTP=GLOB(0x180c6a8)<<< 220-IPv6 connections are also welcome on this server. 
Net::FTP=GLOB(0x180c6a8)<<< 220 You will be disconnected after 15 minutes of inactivity.
Net::FTP=GLOB(0x180c648)>>> user user_name 
Net::FTP=GLOB(0x180c648)<<< 331 User user_name OK. Password required 
Net::FTP=GLOB(0x180c648)>>> PASS .... 
Net::FTP=GLOB(0x180c648)<<< 230-User user_name has group access to: user_name wheel 
Net::FTP=GLOB(0x180c648)<<< 230 OK. Current restricted directory is / 
Net::FTP=GLOB(0x180c648)>>> CWD public_html/uploaded/product_images/ 
Net::FTP=GLOB(0x180c648)<<< 250 OK. Current directory is /public_html/uploaded/product_images 
Net::FTP=GLOB(0x180c648)>>> PORT 192,168,1,10,200,38 
Net::FTP=GLOB(0x180c648)<<< 200 PORT command successful
Net::FTP=GLOB(0x180c648)>>> NLST 
Net::FTP=GLOB(0x180c648)<<< 150 Connecting to port 50703 
Net::FTP=GLOB(0x180c648)<<< 226-Options: -a 
Net::FTP=GLOB(0x180c648)<<< 226 Output truncated to 2000 matches 
Net::FTP=GLOB(0x180c648)>>> ALLO 7903 
Net::FTP=GLOB(0x180c648)<<< 200 Zzz... 
Net::FTP=GLOB(0x180c648)>>> PORT 192,168,1,10,200,39 
Net::FTP=GLOB(0x180c648)<<< 200 PORT command successful 
Net::FTP=GLOB(0x180c648)>>> STOR 097360718843.jpeg 
Net::FTP=GLOB(0x180c648)<<< 150 Connecting to port 50704 
Net::FTP=GLOB(0x180c648)<<< 226-File successfully transferred
Net::FTP=GLOB(0x180c648)<<< 226 0.381 seconds (measured here), 20.21 Kbytes per second 
Net::FTP=GLOB(0x180c648)>>> SITE chmod 600 097360718843.jpeg 
Net::FTP=GLOB(0x180c648)<<< 200 Permissions changed on 097360718843.jpeg

【问题讨论】:

  • 脚本哪里出错了?还是脚本完成但没有上传文件?
  • 已完成,但没有上传文件。
  • 您如何检查文件是否已上传?根据您发布的调试日志,上传正常。
  • FTP 服务器日志说什么?
  • 226-File successfully transferred 表示您的文件已上传。如果它不存在于服务器上,(a) 您将其上传到您预期之外的地方;尝试查找,(b)您将其上传到错误的服务器; (c) 你的 FTP 服务器坏了。

标签: perl ftp


【解决方案1】:

使用

my $ftp = Net::FTP->new($host, Debug => 1) 
    or die "Could not create FTP object: $@";

其他良好做法:

  • 确保你有

    use strict;
    use warnings;
    
  • 不要在需要变量之前声明它们。

  • 在错误消息中包含错误。

简而言之,试试下面的脚本:

#!/usr/bin/perl

use strict;
use warnings;

use Net::FTP;

my $host ='56.309.24.2';
my $user ='user';
my $pw   ='pass';

my $file ='097360718843.jpeg';
my $path ='public_html/uploaded/product_images';

my $ftp = Net::FTP->new($host, Debug => 1) 
    or die "Could not connect to '$host': $@";

$ftp->login($user, $pw) 
    or die sprintf "Could not login: %s", $ftp->message;

$ftp->cwd($path) 
    or die sprintf "Could not login: %s", $ftp->message;

$ftp->ls;

$ftp->binary;

$ftp->put($file) 
    or die die sprintf "Could not login: %s", $ftp->message;

$ftp->site("chmod 600 $file");

【讨论】:

  • 好的,我得到了一些输出。我登录到服务器,所以建立了连接但没有上传。
  • Net::FTP>>> Net::FTP(2.75) Net::FTP>>> Exporter(5.58) Net::FTP>>> Net::Cmd(2.26) Net:: FTP>>> IO::Socket::INET(1.27) Net::FTP>>> IO::Socket(1.28) Net::FTP>>> IO::Handle(1.24) Net::FTP=GLOB(0x180c6a8 )
  • 尝试$ftp-&gt;binary,这样您就不会尝试以 ASCII 模式上传二进制文件。另外,您是在运行上面的确切脚本还是进行了任何修改?你真的不再收到调试消息了吗?
  • 对不起,这里是完整的输出
  • 所以,看起来文件传输正在发生。它是否有可能被写在意想不到的地方?我还建议删除最后一个命令,以确保它没有任何意外的副作用。
【解决方案2】:

检查目标目录的保护。 确保您可以在那里创建文件。

检查文件本身的保护 确保您可以覆盖它们。

【讨论】:

  • 好吧,它实际上并没有上传文件,因为我在目录中看不到它。我可以使用第 3 方 ftp 程序在此目录中创建文件并将文件上传到其中。我真的不知道为什么会这样。
【解决方案3】:

上传成功:

226-File successfully transferred

它应该可以通过网络浏览器中的文件 url 访问。但是由于 ftp 服务器文件列表限制,您无法在 ftp 客户端看到它 - 文件数量超过 2000:

226 Output truncated to 2000 matches

解决方案是保存到其他文件夹,或者如果您有权访问服务器端 ftp 配置来更改该文件限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    相关资源
    最近更新 更多