php 利用socket上传文件

张映 发表于 2010-06-02

分类目录: php

标签:, ,

一,利用fsockopen来上传文件

以前我写过一篇关于socket通信原理的博文http://blog.51yip.com/php/673.html有兴趣的朋友可以看看,前面讲的那篇博文,socket的服务器和客户端都是要用php命令来运行的。平常我们上传文件是浏览本地文件,通过一个php程序将文件上传一个地方,这个时候我们用php命令来运行php程序就不方便了。这个时候我们可以用fsockopen来打开一个socket通道,并且可以通过浏览器来访问页面。下面有一个例子,大家可以试一下。

二,upload.html

<html>
<body>
<form action='image.php' method='post' name='form' enctype='multipart/form-data'>
<input type='file' name='photo'>
<input type=submit value='submit'>
</form>
</body>
</html>

浏览本地文件上传到中间文件image.php

三,image.php来向socket传送数据

<?php
$fp = fsockopen("127.0.0.1", 10008, $errno, $errstr, 10);

$array = $_FILES['photo'];

if(!$fp){
	echo "open fail";
}else{

	if(!empty($array)){

	$str= 'filename:'.$array['name'];
	fwrite($fp,$str);
	$filename = $array['tmp_name'];
	$handle = fopen($filename, "r");

	$contents = fread($handle, filesize($filename));

	fwrite($fp,$contents);
	}
	echo $fp;
}
fclose($fp);
?>

他的作用是和SOCKET服务器,建立通信,将数据输送到socket通道中

四,server.php接收到数据

<?php
// 建立server端socket
$tcp = getprotobyname("tcp");
$socket = socket_create(AF_INET, SOCK_STREAM, $tcp);
socket_bind($socket, '127.0.0.1', 10008);       //绑定要监听的端口
socket_listen($socket);       //监听端口

//初始化一个数据,和客户端通信
$buffer = "connect";
$path = "/home/zhangy/www/test/";
while (true) {
	// 接受一个socket连接
	$connection = socket_accept($socket);
	if(!$connection){
		echo "connect fail";
	}else{
			echo "Socket connected\n";
			// 向客户端传递一个信息数据
			if ($buffer != "") {
				echo "send data to client\n";
				socket_write($connection, $buffer . "\n");
				echo "Wrote to socket\n";
			} else {
				echo "no data in the buffer\n" ;
			}

			//从客户端取得数据
     while($flag = @socket_recv($connection, $data, 2048, 0)){
          if (false !== strpos($data,'filename:')){
             $filename = substr($data,9);

             $filename = $path.$filename;
             			  //根据传过来的名子打开一个文件
             $fp = fopen($filename,"wb");
             continue;
          }
        fwrite($fp,$data);
     }
     		fclose($fp);
	}

	socket_close($connection);
	//关闭 socket
	printf("Closed the socket\n");
}
?>

他的作用是接收数据,并将数据存储存起来



转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/php/686.html

4 条评论

  1. 小亮 留言

    总结的不错,力挺一下。。

  2. ljc 留言

    谢谢你的分享,但是根据你这个例子,穿的图片不完整,图片下半截是灰色的,不知道是什么情况?

  3. jarod 留言

    image.php 这行少个 "\n\r"
    $filename .= "\n\r";

    $handle = fopen($filename, "r");

  4. jarod 留言

    留言不能编辑了。
    貌似不加 "\n\r" 也可以的。
    :_)