php提交表单 上传图片,php 利用http上传协议(表单提交上传图片 )

主要就是利用php 的 fsocketopen 消息传输。 这里先通过upload.html 文件提交,利用chrome抓包,可以看到几个关键的信息。

首先指定了表单类型为multipart/form-data;。

boundary是分隔符

因为上传文件不在使用原有的http协议了。请求内容不再可能以

x = y方式发送了。而使用了

分隔符

字段内容

分隔符号

字段内容2

而boundary就是指定分隔符号的标志。

请求的内容就应该是这样的了。

9cd7a78808cb9e728037adf2a1db1c6a.png

在来看下消息体

9b56b5bc54f32bd8750c4569c81950ce.png

#socket_upload.php  拼接http上传协议格式 post请求

class SOCKET_UPLOAD

{

private $host = '127.0.0.1';

private $port = 80;

private $errno = null;

private $errstr = null;

public $timeout = 30;

public $url = '/socket/socketupload/upload.php';//请求地址

private $fp = null;

private $header = ''; //头信息

private $body = ''; //消息体

private $boundary = '----abcdefg'; //指定分隔符号的标志

private $res = null; //完整字符串

private $file = null; //文件

private $form = null; //表单

public function __construct($form ='',$file='')

{

//连接本地80端口

$this->fp = fsockopen($this->host,$this->port,$this->errno,$this->errstr,$this->timeout);

if (!$this->fp)

exit('failed');

//赋值

$this->form = $form;

$this->file = $file;

//设置头信息,消息体

$this->setHead();

$this->setBody();

//拼接整个请求信息

$this->getStr();

}

public function write()

{

//echo $this->res;

//写入

fwrite($this->fp, $this->res);

//打印输出信息

$response = '';

while($row=fread($this->fp, 4096)){

$response .= $row;

}

fclose($this->fp);

$pos = strpos($response, "\r\n\r\n");

$response = substr($response, $pos+4);

echo $response;

}

private function getStr()

{

$this->header .= "Content-Length:".strlen($this->body)."\r\n";

$this->header .= "Connection: close\r\n\r\n";

$this->res = $this->header.$this->body;

}

//设置头信息

private function setHead()

{

$this->header .= "POST {$this->url} HTTP/1.1\r\n";

$this->header .= "HOST:{$this->host} \r\n";

$this->header .= "Content-Type:multipart/form-data; boundary={$this->boundary}\r\n";

}

//设置消息体

private function setBody()

{

$this->form();

$this->file();

}

//非文件表单

private function form()

{

if ($this->form && is_array($this->form))

{

foreach ($this->form as $key=>$val)

{

$this->body .= "--$this->boundary"."\r\n";

$this->body .= "Content-Disposition: form-data; name=\"{$key}\"\r\n";

$this->body .= "Content-type:text/plain\r\n\r\n";

$this->body .= "{$val}\r\n";

}

}

}

//文件表单

private function file()

{

if ($this->file && is_array($this->file))

{

foreach ($this->file as $key=>$val)

{

$this->body .= "--$this->boundary"."\r\n";

$this->body .= "Content-Disposition: form-data; name=\"{$val['name']}\"; filename=\"{$val['filename']}\"\r\n";

$this->body .= "Content-Type: {$val['type']}\r\n\r\n";

$this->body .= file_get_contents($val['path'])."\r\n";

$this->body .= "--{$this->boundary}";

}

}

}

}

$form = [

'name'=>'lemon',

'age'=>'12'

];

$file = [

[

'name'=>'file',

'filename'=>'a.jpg',

'path'=>'a.jpg',

'type'=>'image/jpeg',

]

];

$upload = new SOCKET_UPLOAD($form,$file);

$upload->write();

#接收post请求并保存图片代码

defined('UPLOAD') or define('UPLOAD',dirname(__FILE__).'/upload');

if ($_FILES['file']['error'] == 0){

$name = $_POST['name'];

$age = $_POST['age'];

echo 'name is:',$name,"
age is:",$age."
";

$file = $_FILES['file'];

$ext = strrchr($file['name'],'.');

$filename = $_SERVER["REQUEST_TIME"].$ext;

if (move_uploaded_file($file['tmp_name'],UPLOAD.'/'.$filename)) {

echo ''.%24filename.'';

}

}

范例代码:http://files.cnblogs.com/files/loveyouyou616/socket.zip

基于Http原理实现Android的图片上传和表单提交

版权声明:本文由张坤  原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/794875001483009140 来源:腾云阁  ...

如何用elementui去实现图片上传和表单提交,用axios的post方法

下面是在vue搭建的脚手架项目中的组件component文件夹下面的upload.vue文件中的内容 & ...

利用jquery.form.js实现将form提交转为ajax方式提交的方法(带上传的表单提交)

提供一种方法就是利用jquery.form.js. (1)这个框架集合form提交.验证.上传的功能. 核心方法 -- ajaxForm() 和 ajaxSubmit() $('#myForm').a ...

swift文件上传及表单提交

var carData:NSMutableDictionary = NSMutableDictionary(); var request:NSMutableURLRequest = NSMutable ...

ajax方式提交带文件上传的表单,上传后不跳转

ajax方式提交带文件上传的表单 一般的表单都是通过ajax方式提交,所以碰到带文件上传的表单就比较麻烦.基本原理就是在页面增加一个隐藏iframe,然后通过ajax提交除文件之外的表单数据,在表单数 ...

C# Winform利用POST传值方式模拟表单提交数据(Winform与网页交互)

其原理是,利用winfrom模拟表单提交数据.将要提交的參数提交给网页,网页运行代码.得到数据.然后Winform程序将网页的全部源码读取下来.这样就达到windows应用程序和web应用程序之间传參 ...

文件上传---form表单,ajax,jquery,以及iframe无刷新上传 (processData,contentType讲解)

服务端程序: import tornado.web import os IMG_LIST=[] class IndexHandler(tornado.web.RequestHandler): def ...

thinkphp图片上传+validate表单验证+图片木马检测+缩略图生成

目录 1.案例 1.1图片上传  1.2进行图片木马检测   1.3缩略图生成   1.4控制器中调用缩略图生成方法 1.案例 前言:在thinkphp框架的Thinkphp/Library/Thin ...

PHP流式上传和表单上传(美图秀秀)

最近需要开发一个头像上传的功能,找了很多都需要授权的,后来找到了美图秀秀,功能非常好用. <?php /** * Note:for octet-stream upload * 这个是流式上传PH ...

随机推荐

zookeeper原理解析-数据存储

Zookeeper内存结构 Zookeeper是怎么存储数据的,什么机制保证集群中数据是一致性,在网络异常,当机以及停电等异常情况下恢复数据的,我们知道数据库给我们提供了这些功能,其实zookeepe ...

HTML 学习笔记 JavaScript(数据类型)

字符串 数字 布尔 数组 对象 Null Undefined JavaScript 拥有动态类型 JavaScript拥有动态类型 这意味着相同的变量可用作不同的类型: 实例: var x // x ...

Qt之QTableView显示富文本

简述 对于QTableView中的显示,我们前面介绍过很多种,其中包括:文本.进度条.复选框等,今天我们介绍一下关于富文本的显示. 可能绝大多数小伙伴会通过QAbstractTableModel中的d ...

Sql中判断&quot&semi;库、表、列,视图,存储过程&quot&semi;是否存在

--判断数据库是否存在 IF EXISTS (SELECT * FROM MASTER.sys.sysdatabases WHERE NAME = '库名') PRINT 'exists ' else ...

bzoj 2301 &lbrack;HAOI2011&rsqb;Problem b(莫比乌斯反演)

Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数 ...

WinPcap编程(二)

0. 这一次具体讲抓包的两种方法. (建议)清除ARP表,最好自己写个批处理命令.快一点. 1.0 抓包步骤 步骤很简单:先打开适配器列表 --> 选择适配器 --> 通过遍历链表的方式到 ...

百度地图JS 搜索悬浮窗功能

这个需求的效果类似下面的截图,主要还是利用百度地图中自定义控件的功能,挺简单的.文档地址在这 http://lbsyun.baidu.com/index.php?title=jspopular 效果图 ...

python全栈开发day110-Flask基础语法

1.Flask 初识: 短小精悍,三方支持的组件多 稳定性较差 2.三行 :启动flask服务 from flask import Flask app = Flask(__name__) app.ru ...

kNN算法基本原理与Python代码实践

kNN是一种常见的监督学习方法.工作机制简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k各训练样本,然后基于这k个“邻居”的信息来进行预测,通常,在分类任务中可使用“投票法”,即选择这k ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值