在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不能上传文件的问题得以解决。
此问题的关键点:临时上传目录要给予权限。