最近的工作中要用到手机上传图片到PHP服务端,一般会有两种方式来实现,一种是让手机客户端模拟HTTP POST方式,还有一种就是用二进制流方式。
最后决定用二进制方式来接收图片的上传。
1.客户端模拟图片上传程序(test.php):
<?php $data=file_get_contents('1.png'); $http_entity_body = $data; $http_entity_type = 'application/x-www-form-urlencoded'; $http_entity_length = strlen($http_entity_body); $host = '127.0.0.1'; $port = 80; $path = '/upload.php'; $fp = fsockopen($host, $port, $error_no, $error_desc, 30); if ($fp) { fputs($fp, "POST {$path} HTTP/1.1\r\n"); fputs($fp, "Host: {$host}\r\n"); fputs($fp, "Content-Type: {$http_entity_type}\r\n"); fputs($fp, "Content-Length: {$http_entity_length}\r\n"); fputs($fp, "Connection: close\r\n\r\n"); fputs($fp, $http_entity_body . "\r\n\r\n"); while (!feof($fp)) { $d .= fgets($fp, 4096); } fclose($fp); echo $d; } ?>
2.服务端接收程序(upload.php):
<?php error_reporting(E_ALL); function get_contents() { $xmlstr = file_get_contents('php://input')?file_get_contents('php://input') : gzuncompress($GLOBALS['HTTP_RAW_POST_DATA']);//得到post过来的二进制原始数据 $filename=time().'.png'; if(file_put_contents($filename,$xmlstr)){ echo 'success'; }else{ echo 'failed'; } } get_contents(); ?>
执行test.php,看看你的根目录是不是有新的图片了!
众所周知,通过二进制方式的不能够通过get,post方式拿到参数,那怎么进行参数的传递呢?
答案就是让客户端把二进制进行一个分割组拼即可,服务端只需要把拿到的二进制字符串进行分隔就可以得到了。
3户端模拟图片上传程序(test2php):
<?php $data=file_get_contents('1.png'); $data = 'www.4jcms.com[x]四季企业网站系统[]'.$data;//假设服务端需要额外的两个参数,URL以及站名,我们用“[x]”进行组合,服务端也用这个进行拆分 $http_entity_body = $data; $http_entity_type = 'application/x-www-form-urlencoded'; $http_entity_length = strlen($http_entity_body); $host = '127.0.0.1'; $port = 80; $path = '/upload2php'; $fp = fsockopen($host, $port, $error_no, $error_desc, 30); if ($fp) { fputs($fp, "POST {$path} HTTP/1.1\r\n"); fputs($fp, "Host: {$host}\r\n"); fputs($fp, "Content-Type: {$http_entity_type}\r\n"); fputs($fp, "Content-Length: {$http_entity_length}\r\n"); fputs($fp, "Connection: close\r\n\r\n"); fputs($fp, $http_entity_body . "\r\n\r\n"); while (!feof($fp)) { $d .= fgets($fp, 4096); } fclose($fp); echo $d; } ?>
4服务端接收程序(upload2php):
<?php error_reporting(E_ALL); function get_contents() { $xmlstr = file_get_contents('php://input')?file_get_contents('php://input') : gzuncompress($GLOBALS['HTTP_RAW_POST_DATA']);//得到post过来的二进制原始数据 $arr = explode("[x]",$data,3); $url = $arr[0]; //网址参数 $sitename = $arr[1]; //站名参数 $data = $arr[2]; //图片二进制字符串 $filename=time().'.png'; if(file_put_contents($filename,$data)){ echo 'success'; }else{ echo 'failed'; } } get_contents(); ?>
运行test2.php看看,是不是就得到你想要的结果了呢。
相关推荐
在做一个摄像头拍照然后上传的功能,php中使用php://input来获取内容。于是就了解了下php://input。 从官网信息来看,php://input是一个只读信息流,当请求方式是post的,并且enctype不等于”multipart/form-data”...
对一php://input介绍,PHP官方手册文档有一段话对它进行了很明确地概述。 “php://input allows you to read raw POST data. It is a less memory intensive alternative to $...
对于php://input介绍,PHP官方手册文档有一段话对它进行了很明确地概述。 “php://input allows you to read raw POST data. It is a less memory intensive alternative to$...
今天查看代码时,忽然想到一个问题:php://output和php://stdout有什么区别? 从PHP的官方文献中找答案,对输入流php://stdin和php://input的解释分别如下(输出流的解释过于简略): php://stdin php://stdin, ...
从官网信息来看,php://input是一个只读信息流,当请求方式是post的,并且enctype不等于”multipart/form-data”时,可以使用php://input来获取原始请求的数据。 看一个简单的例子。 客户端就是一个表单,非常简单。...
本文实例分析了php中$_POST与php://input的区别。分享给大家供大家参考。具体分析如下: $_POST 与 php教程://input可以取到值,$HTTP_RAW_POST_DATA 为空 $_POST 以关联数组方式组织提交的数据,并对此进行编码处理...
在去年10月份,我在博客中分析了php接收前台name值相同的表单提交数据的处理的问题,当时说的方案是为把name值改成数组类型,php接收到之后,再对数组进行合并处理。这样做的缺点就是不完全兼容前台表单,用户必须要...
使用360手机助手(安装之后是竖屏)截图,发现HDMI显示的分辨率只有819x1280。 由于使用perf3的ENG模式编译的系统,adb shell默认可以连接,360手机助手直接连接android。 Microsoft Windows [版本 6.1.7601] 版权...
layui 输入筛选选择 插件 基于https://layui.tool.hi.cn/extend/selectInput/in
讲述linux操作系统的基本命令,第一个命令ls命令的使用
本篇文章是对file_get_contents("php://input", "r")的实例进行了详细的分析介绍,需要的朋友参考下
Bootstrap4 支持,含有超过50个模板页面,使用插件包括: Bootstrap https://getbootstrap.com/ animate.css http://daneden.me/animate Bootstrap Tagsinput ...
NULL 博文链接:https://xblia.iteye.com/blog/1756107
搭建视频直播服务器需要的Nginx模块,rtmp协议模块的源码。