【问题标题】:uploading csv fie to ftp server - file empty将 csv 文件上传到 ftp 服务器 - 文件为空
【发布时间】:2013-06-09 23:51:43
【问题描述】:

我正在尝试将来自本地服务器的文件存储在 ftp 服务器上。

源文件在我当前目录下(和php文件一样)

我使用http://www.server.co.za/kisv2/xmltest/export.php 运行脚本

要上传到 ftp 的文件是 http://www.server.co.za/kisv2/xmltest/exportfile.csv

目标ftp路径为:ftp://ftp.ftpserver.co.za/LocExports/exportfile.csv

我的 ftp 登录默认为:ftp://ftp.ftpserver.co.za

所以我想将文件从当前目录exportfile.csv 复制到ftp://ftp.ftpserver.co.za/LocExports/exportfile.csv

我当前的语法是:

$source = 'exportfile.csv';  //this is a file in the same directory as my php file. full path is... http://www.server.co.za/kisv2/xmltest/exportfile.csv
$target = '/LocExports/exportfile.csv'; //full path is... ftp://ftp.ftpserver.co.za/LocExports/exportfile.csv

$conn = ftp_connect("ftp.ftpserver.co.za") or die("Could not connect");
ftp_login($conn, "username", "password");

$upload = ftp_put($conn, $target, $source, FTP_ASCII);
if (!$upload) { echo 'FTP upload failed!'; }

echo "complete";

这给了我错误Warning: ftp_put() [function.ftp-put]: Opening ASCII mode data connection。该文件确实出现在 FTP 服务器上,但为空白且大小为 0 字节。

欢迎任何想法。

感谢和问候

更新

$source = 'exportfile.csv';  
$target = '/LocExports/exportfile.csv'; 

$conn = ftp_connect("ftp.server.co.za") or die("Could not connect");
ftp_login($conn, "username", "password");

ftp_pasv($conn, true); 

$upload = ftp_put($conn, $target, $source, FTP_BINARY);
if (!$upload) { echo 'FTP upload failed!'; }

echo "complete";

这仍然失败: Warning: ftp_put() [function.ftp-put]: Opening BINARY mode data connection.

文件在 ftp 上创建但为空。

再次感谢

【问题讨论】:

    标签: php file-upload ftp


    【解决方案1】:

    ftp_login(...) 之后添加ftp_pasv($conn, true);

    来自http://www.php.net/manual/en/function.ftp-put.php

    如果在使用 ftp_put 时出现以下错误之一:

    警告:ftp_put() [function.ftp-put]:打开 ASCII 模式数据 连接

    警告:ftp_put() [function.ftp-put]: 打开 BINARY 模式数据 连接

    它会在正确的位置创建文件,但它是一个 0kb 的文件,并且 此后所有 FTP 命令都失败。客户很可能是 在防火墙后面。纠正这种使用:

    ftp_pasv($conn, true);

    在执行任何 put 命令之前。我花了很长时间才弄清楚这一点 当我这样做时,我真的欢呼了:D

    【讨论】:

    • 谢谢亚历克斯,尝试了同样的结果。现在将用我的语法更新问题......也尝试了二进制文件,结果相同。
    • 谁在托管该服务器,是您自己的还是托管公司?
    • 嗨,Alex,它位于他们拥有的公司 FTP 服务器后面。您认为这是 FTP 服务器安全问题而不是脚本问题吗?如果是这样,我们如何测试?
    • 我现在很想欢呼 :-)
    • 他们的 ftp 服务器的 PASSIVE 模式已启用(这是您需要的),但他们没有在防火墙上为其打开端口范围。要确认这一点,请使用您最喜欢的 FTP 客户端应用程序,将其设置为 PASSIVE 模式,连接到他们的服务器并尝试(手动)上传相同的文件。如果它不起作用,则他们或您有防火墙问题。
    【解决方案2】:

    我遇到了同样的问题。创建的文件但大小为 0 KB。将模式设置为被动后,我的文件成功传输到 FTP 服务器。 事实上,在 FTP 服务器上上传文件时,我们必须注意 3 件事。

    1. 将文件类型设置为 BINARY:objFtpClient.setFileType(FTP.BINARY_FILE_TYPE);

    2. 将文件传输模式设置为 BINARY:objFtpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE);

    3. 将模式设置为被动(我不知道它在内部做什么。但它可以工作......!):objFtpClient.enterLocalPassiveMode();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 2014-10-17
      相关资源
      最近更新 更多