我们经常把图片上传到网上, 也从网上下载/浏览图片, 有没有想过, 这是怎么一回事?

       先来看看图片的上传, 现在很多网站有这个功能, 上传后, 会生成一个对应的url,  如:


        csdn就是这样的,  要你先上传图片, 然后插入博文。 如上就是图片上传的过程。 那这个图片上传到了那里呢?  肯定是一台存储服务器啊。


       当我们用浏览器去访问这个图片url的时候, 浏览器发出http请求, 那么存储服务器上必然有服务程序来读取这个图片, 然后把图片以二进制流的形式吐给浏览器, 这个二进制串必然对应一个文件, 浏览器把这个二进制串还原成对应的文件, 于是就能看到文件的内容了。

        我们可以在linux上wget url的方式来下载这个文件, 当然也可以用curl url -o 1.jpg的方式来下载文件。 那用curl下载的过程是怎样的呢?

        curl发起http请求, 图片服务器上的服务程序读取服务器上的图片文件, 然后以二进制流的形式, 吐给linux机器上的curl命令进程, 于是curl就得到了一个string串形式的二进制串, 那么curl当然有能力把这个二进制还原为一个文件(实际上fwrite就是专门做这个事情的), 然后用-o指定二进制串保留成的文件, 于是在1.jpg就是二进制串组成的文件, 万事大吉。

       如果抓包看, 就会发现, 在response中, 出去http头等信息, 传输的二进制串(sudo tcpdump -iany src port 80 -Xnlps0)与文件的二进制串(xxd命令)完全一致.

       很简单。


       最后, 为了对比理解, 可以执行curl http://www.baidu.com,  结果是一段html文本, 你能清晰地看到。 如果是curl http://chuantu.biz/t6/57/1505924700x1951244753.jpg 呢? 那自然是一段二进制串咯, 你看起来就是乱码。  

       其实, 两者的本质都是二进制码流, 无需多说。 看图, 睡觉:








本文转载:CSDN博客