1

我做了一个脚本,它必须从 ftp 服务器加载一个文件然后解析它。该代码依赖 tempname 来存储临时存储的 ftp 文件。在我的开发服务器(使用 php 5.3.10)上,这可以完美运行,但是在客户端计算机(使用 php 5.2.17)上却没有,并且给了我:

Warning: ftp_rawlist() [function.ftp-rawlist]: Unable to create temporary file. Check permissions in temporary files directory.

有人可以告诉我我能做什么吗?(我对php的可能性有点弱)

我使用了这段代码:

define ("LOCALFILE",tempnam('/tmp', 'data-'));
define ("USER","myusername");
define ("PASS","mypassword");
define('SERVER', "ftpserver.com");
define ("DIR","/path/");

function getFTPFile(){

    // connect
    if(!($conn_id = @ftp_connect(SERVER))){
        Error::throwOne("Could not connect to ".SERVER);

    };
    // login 
    if(!($login_result = @ftp_login($conn_id, USER, PASS))){
        Error::throwOne("LOGIN INCORRECT! user:".USER." pass:".PASS);
    };
    // try to change the directory to somedir
    if (!ftp_chdir($conn_id, DIR)) {
        Error::throwOne("Couldn't change directory\n");
    }; 

    if(!($a = ftp_rawlist($conn_id, '-1t'))){
        Error::throwOne("Couldn't get ftp_rawlist\n");
    };

    $server_file=($a[0]);
    if (!ftp_get($conn_id, LOCALFILE, $server_file, FTP_BINARY)) {
        Error::throwOne("Couldn't get file\n");
    };
    ftp_close($conn_id);    
};
4

3 回答 3

3

该错误在我看来就像系统生成的,与您的 tmpname 无关。在内部,FTP 将文件存储在它自己的临时文件中,在标准临时目录中的临时文件名中,直到它被下载 - 然后将其移动到您指定的位置。

尝试将此代码放在您的下载代码之前:

$tmpdir = sys_get_temp_dir();
echo "Temp dir: $tmpdir\n";
echo  is_writable($tmpdir) ? "Temp dir is writable" : "Temp dir is not writable";

这将告诉您是否有权写入系统临时目录。我进一步建议您$tmpdir在代码中使用此变量而不是硬编码“/tmp”。

于 2012-06-11T06:22:06.030 回答
2

我发现了这个问题。由于我的主机不喜欢 /tmp 目录(谁会责怪他们),我需要先设置 putenv('TMPDIR=/the tmp-dir my provider give me'); 然后与 tempname 一起使用

于 2012-06-11T19:49:39.303 回答
0

我发现这发生在 Windows Server 2016 上 - 这是因为我的 %TEMP% 环境变量指向了一个不存在的子目录,无论出于何种原因。

不过,当我以管理员身份运行它时,它确实指向了正确的那个。

于 2021-07-14T22:44:49.463 回答