在php中使用ftp函数进行文件上传功能的开发,可以正常连接到ftp服务器端,但就是无法上传文件。
程序代码如下:
<?php
//测试ftp上传文件
//by www.jb200.com
if ($_POST['action']=='上传')
{
$tmpname = $_FILES['file']['tmp_name'];
$filename = $_FILES["file"]["name"];
$conn_id = ftp_connect('192.168.11.186') or die('连接失败');
$ftp_user = 'user1';
$ftp_pass = 'xxxxxx';
if(! @ftp_login($conn_id, $ftp_user, $ftp_pass)){
    echo '登录失败<br/>';  
} else {
    echo "连接成功<br/>";
}
echo ftp_pwd();
//ftp_pasv($conn_id, true);
$remote = '/d/file/' . $filename;
$local = $tmpname;
if(ftp_put($conn_id, $remote,$local, FTP_BINARY)){
    echo '图片ftp上传成功 '.$local . "<br/>";;
}  else {
   echo '图片 Ftp 上传失败' . $local . " - " . $remote . "<br/>";
}
    
ftp_close($conn_id);
}
?>
<table width="100%" border="0" align="center" cellpadding="3" cellspacing="1" class="tableborder">
        <form action="do.php" method="post" enctype="multipart/form-data" name="etform">         
          <tr bgcolor="#FFFFFF"> 
            <td>本地上传</td>
            <td><input name="file" type="file" size="32"> </td>
          </tr>          
          <tr bgcolor="#FFFFFF"> 
            <td> </td>
            <td><input type="submit" name="action" value="上传"></td>
          </tr>
        </form>
      </table>
运行结果:
 
使用ftp命令测试到ftp服务端的连接如下:

由上图可知,连接是正常的。
可是为什么不能正常上传文件呢?
首先,尝试了如下的方法。
1,开启apache中针对当前站点的错误日志记录功能。

2,运行php程序,继续测试ftp上传功能。
3,查看错误日志,发现如下错误信息:
 
 
原来,在linux系统中,php配置文件中的上传文件的临时文件目录,如果没有配置的话,默认为/tmp/。
默认情况下,该目录没有网站的可写入权限,因此不能存储临时文件$_FILES[file]['tmp_name'],所以上传失败。
找到原因了,解决办法就简单了,用vim打开/etc/php.ini中,作如下修改:

去掉upload_tmp_dir前的注释分号,然后定上临时文件的目录即可。
最后记得加上apache站点用户的可写权限:
 
再次上传,成功。
至此,在php中使用ftp_put不能上传文件的问题得以解决。
此问题的关键点:临时上传目录要给予权限。