我做了一个脚本,它必须从ftp-server加载文件然后解析它。代码依赖于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);
};
答案 0 :(得分: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”。
答案 1 :(得分:2)
我发现了这个问题。 由于我的主机不喜欢/ tmp目录(谁会责备他们) 我需要先设定 putenv('TMPDIR = / tmp-dir,我的提供者给了我'); 然后使用tempname
答案 2 :(得分:0)
我发现这发生在 Windows Server 2016 上 - 这是因为我的 %TEMP% 环境变量指向了一个不存在的子目录。
不过,当我以管理员身份运行它时,它确实指向了正确的。