三步FTP实现PHP上传文件代码剖析

想知道上传文件的详细步骤吗,下面我就带大家一起详细分析一下吧。利用PHP,你总是可以有多种方式来完成某个特定的任务。我们就拿文件上传举个例子。当然了,你可以按照传统的方式来使用HTTP文件上传,把文件直接传输到Web服务器磁盘上。你还可以用更加奇异的方式上传,用FTP协议两步就完成上传:从你的本地硬盘到Web服务器,然后再到FTP服务器。

    PHP在本机同时支持FTP和HTTP上传,所以你可以根据自己应用程序的设计需要进行最佳的选择。使用PHP的FTP函数进行文件传输几乎与使用传统的FTP客户端相同——你会看到连函数的名字都和标准的FTP命令类似。关于HTTP文件上传的文章已经多得满天飞了,这就是为什么本文有必要把注意力放在基于FTP的文件上传上了(但是在后面给出的例子中,两种方式你都会看到)。要注意的是,本教程假设你已经安装好了PHP/Apache,而且HTTP文件上传和FTP的函数都已经激活了。本文可以从这里下载,所有的源代码都以单独的文本方式列出来了。

第一步:确信你拥有连接/上传到FTP服务器的权限

PHP的FTP函数需要客户端-服务器连接,所以你需要在进行文件上传之前登录到目标服务器上。你的第一项任务是确信你已经拥有了完成这项任务的信任书。这一步可能看起来是理所当然的,但是你会惊奇地发现有多少开发人员忘了这么做,结果后来浪费大量的时间来解决因此而出现的问题。你可以通过使用命令行的FTP客户端登录到目标服务器上,以检查连接状况并尝试上传一个假文件。

PHP上传文件代码列表A

$ftp  
ftp>opensome.host.com  
Connectedtosome.host.com.  
220WelcometoleonFTPServer!  
User:upload  
331Useruploadokay,needpassword.  
Password:***  
230Restricteduserloggedin.  
ftp>bin  
200Typeokay.  
ftp>hash  
HashmarkprintingOn?ftp:(2048bytes/hashmark).  
ftp>putfile.bin  
200PORTcommandsuccessful.  
150OpeningBINARYmodedataconnection.  
##  
226Transfercompleted.  
ftp:4289bytessentin0.00Seconds4289000.00Kbytes/sec.  
ftp>bye  
221Goodbye. 

一旦确认有相关的访问权限,你就可以登录出来。

第二步:创建上传表单

然后,创建一个简单的HTML表单,向用户询问重要的参数——FTP服务器的访问信息、服务器上传的目录,以及完整的目录和上传文件的名字。下面这个例子就是这个表单的样式。

PHP上传文件代码列表B

<html> 
<head></head> 
<body> 
<h2>Pleaseprovidethefollowinginformation:</h2> 
 
<form enctype="multipart/form-data" method="post" action="upload.php"> 
<input type="hidden" name="MAX_FILE_SIZE" value="5000000"/> 
Host<br/> 
<input type="text" name="host"/><p/> 
Username<br/> 
<input type="text" name="user"/><p/> 
Password<br/> 
<input type="password" name="pass"/><p/> 
Destinationdirectory<br/> 
<input type="text" name="dir"/><p/> 
File<br/> 
<input type="file" name="file"/><p/> 
<input type="submit" name="submit" value="UploadFile"/> 
</form> 
</body> 
</html> 

在这里,<inputtype=file...>元素用来生成文件选择对话框,用户通过它来选择要被上传的文件。<formenctype=...>元素然后就把表单数据编码成为多个部分提交,这可以让PHP更容易地识别提交的文件组件。

第三步:创建PHP上传处理程序

一旦表单被提交给了Web服务器,下一步(也是最后一步)是使用PHP的FTP函数按照用户提供的访问信任书把它传输到目标服务器上。下面就是完成上述所有工作的脚本(upload.php)。

PHP上传文件代码列表C

<?php 
//getFTPaccessparameters  
$host=$_POST['host'];  
$user=$_POST['user'];$pass=$_POST['pass'];  
$destDir=$_POST['dir'];  
$workDir="/usr/local/temp";//definethisasperlocalsystem  
//gettemporaryfilenamefortheuploadedfile  
$tmpName=basename($_FILES['file']['tmp_name']);  
//copyuploadedfileintocurrentdirectory  
move_uploaded_file($_FILES['file']['tmp_name'],$workDir."/".$tmpName)ordie("Cannotmoveuploadedfiletoworkingdirectory");  
//openconnection  
$conn=ftp_connect($host)ordie("Cannotinitiateconnectiontohost");  
//sendaccessparameters  
ftp_login($conn,$user,$pass)ordie("Cannotlogin");  
//performfileupload  
$upload=ftp_put($conn,$destDir."/".$_FILES['file']['name'],$workDir."/".$tmpName,FTP_BINARY);  
//checkuploadstatus  
//displaymessage  
if(!$upload){  
echo"Cannotupload";  
}else{  
echo"Uploadcomplete";  
}  
//closetheFTPstream  
ftp_close($conn);  
//deletelocalcopyofuploadedfile  
unlink($workDir."/".$tmpName)ordie("Cannotdeleteuploadedfilefromworkingdirectory--manualdeletionrecommended");  
?> 





FTP将图片上传到指定服务器实例


$IP = C("FTP_SERVER_IP"); //FTP服务器IP
        $Port = C("FTP_PORT"); //端口号
        $TimeOut = C("FTP_TIMEOUT"); //超时时间设定,默认为90
        $conn_id = ftp_connect($IP, $Port, $TimeOut);
        if (!$conn_id) {
            echo $this->return_json(300, "创建FTP连接失败!");
            exit;
        }
        $ftp_user = C("FTP_UN"); //FTP登陆用户名
        $ftp_pass = C("FTP_PW"); //FTP登陆密码
        if (!ftp_login($conn_id, $ftp_user, $ftp_pass)) {
            echo $this->return_json(300, "FTP服务器登陆失败!");
            exit;
        }
//        返回当前 FTP 被动模式是否打开,在被动模式打开的情况下,数据的传送由客户机启动,而不是由服务器开始。
//        请注意 ftp_pasv() 只能在 FTP 登录成功后方可调用,否则会失败。
        ftp_pasv($conn_id, true);
        if (!empty($fileName1)) {
            $remoteFile = $fileName1; //FTP服务器所保存的文件名称和地址
            $localFile = "./Salepoints/" . $fileName1;
            //上传图片文件至FTP服务器
            $result = ftp_put($conn_id, $remoteFile, $localFile, FTP_BINARY);
        }
ftp_close($conn_id);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值