content-length: 这个值是从--$boundary,\r\nContent-Disposition: form-data; name=\"".rawurlencode($k)."\"\r\n\r\n, ...文件内容。。。\r\n".$boundary_2."--\r\n\r\n结束。注意:
最后的content的分割符也就是boundary还有两个--,表示结束。
其实协议是一个规化,代码是一个实现,久而久之,规划成为了规则,如:RFC协议就是一个大家在开发浏览器必须遵守的协议(http的(RFC 1867):让HTML表单可以提交文件。它对HTML表单的扩展),而也具有开放性,为此,各种程序都可以实现这个协议,程序为协议而生,协议为功能而用,下面我们来实现一个通过PHP的Socket来模拟一次浏览器上传一张图片的提交代码,如下:
模拟浏览器遵循的Http协议发送图片程序,boundary开始时有一个 --,结束时:也有有 --,真正结束后有\r\n\r\n:
PHP接收发送过来的图片程序:
测试返回:
为何出现这样的情况呢?查找代码片段imageaaa,这个修改为file即可,修改后如下所示,上传成功:
说明是Ok的,查下upload目录下,果然是在这个图片的,证明PHP是完全可以通过fsocket来模拟Http上传图片协议来实现浏览器上传的。
下面贴出PHP上传图片的简单代码:
同时,这块是Http上传协议,用C,C++,Java也是可以实现的解析该Http协议的,这样图片上传就可以实现跨语言传输了,呵。
Write By:Jackxiang,回忆未来,向东,其实都是一个人哈,呵呵。
附录:
1.代码分析极其图片内容偷换试验情况:
执行查看其Rfc传输的协议:
查看图片:
2.$boundary_2和$boundary的认识:
3.代码boundary后追加--疑问:
对于后面:加上了 --的一般浏览器上传通过抓包查看($encoded .= "\r\n".$boundary_2."--\r\n\r\n"; //加上了--
),上传协议通过Fiddler2抓包查看,发现果然在结尾也多得有一个--的符号,这块可能在see RFC2616中应该有特别描述这块:
看抓包情况的上面两行,在提交下一行的-----------------------------7db434180f1c后面就有一个--:
Content-Disposition: form-data; name="button"
提交
-----------------------------7db434180f1c--
同时参考来源也贴下:http://topic.csdn.net/u/20110619/23/7b0403de-c494-4592-9cc8-9b04f87ddb4a.html?98743
这个兄弟说得较为详细,新添加【2013-04-10】:http://blog.zhaojie.me/2011/03/html-form-file-uploading-programming.html
Add Time:2014-01-18 测试c和epoll多进程上传文本加强版本:
c服务器收到:
Host: localhost
Content-type: multipart/form-data; boundary=---------------------------16b5e60b80
Content-length: 404
Connection: close
-----------------------------16b5e60b80
Content-Disposition: form-data; name="username"
Jerry
-----------------------------16b5e60b80
Content-Disposition: form-data; name="password"
123456
-----------------------------16b5e60b80
Content-Disposition: form-data; name="file"; filename="/tmp/jack.txt"
Content-Type: text/plain
1234567 jjj efg
-----------------------------16b5e60b80--
最后的content的分割符也就是boundary还有两个--,表示结束。
其实协议是一个规化,代码是一个实现,久而久之,规划成为了规则,如:RFC协议就是一个大家在开发浏览器必须遵守的协议(http的(RFC 1867):让HTML表单可以提交文件。它对HTML表单的扩展),而也具有开放性,为此,各种程序都可以实现这个协议,程序为协议而生,协议为功能而用,下面我们来实现一个通过PHP的Socket来模拟一次浏览器上传一张图片的提交代码,如下:
模拟浏览器遵循的Http协议发送图片程序,boundary开始时有一个 --,结束时:也有有 --,真正结束后有\r\n\r\n:
PHP接收发送过来的图片程序:
测试返回:
为何出现这样的情况呢?查找代码片段imageaaa,这个修改为file即可,修改后如下所示,上传成功:
说明是Ok的,查下upload目录下,果然是在这个图片的,证明PHP是完全可以通过fsocket来模拟Http上传图片协议来实现浏览器上传的。
下面贴出PHP上传图片的简单代码:
同时,这块是Http上传协议,用C,C++,Java也是可以实现的解析该Http协议的,这样图片上传就可以实现跨语言传输了,呵。
Write By:Jackxiang,回忆未来,向东,其实都是一个人哈,呵呵。
附录:
1.代码分析极其图片内容偷换试验情况:
执行查看其Rfc传输的协议:
查看图片:
2.$boundary_2和$boundary的认识:
3.代码boundary后追加--疑问:
对于后面:加上了 --的一般浏览器上传通过抓包查看($encoded .= "\r\n".$boundary_2."--\r\n\r\n"; //加上了--
),上传协议通过Fiddler2抓包查看,发现果然在结尾也多得有一个--的符号,这块可能在see RFC2616中应该有特别描述这块:
看抓包情况的上面两行,在提交下一行的-----------------------------7db434180f1c后面就有一个--:
Content-Disposition: form-data; name="button"
提交
-----------------------------7db434180f1c--
同时参考来源也贴下:http://topic.csdn.net/u/20110619/23/7b0403de-c494-4592-9cc8-9b04f87ddb4a.html?98743
这个兄弟说得较为详细,新添加【2013-04-10】:http://blog.zhaojie.me/2011/03/html-form-file-uploading-programming.html
Add Time:2014-01-18 测试c和epoll多进程上传文本加强版本:
c服务器收到:
Host: localhost
Content-type: multipart/form-data; boundary=---------------------------16b5e60b80
Content-length: 404
Connection: close
-----------------------------16b5e60b80
Content-Disposition: form-data; name="username"
Jerry
-----------------------------16b5e60b80
Content-Disposition: form-data; name="password"
123456
-----------------------------16b5e60b80
Content-Disposition: form-data; name="file"; filename="/tmp/jack.txt"
Content-Type: text/plain
1234567 jjj efg
-----------------------------16b5e60b80--
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/4411/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2019-9-14 20:17
评论列表