<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          GET 請求能傳圖片嗎?

          共 1930字,需瀏覽 4分鐘

           ·

          2020-11-21 04:24

          程序員的成長之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
          關(guān)注


          閱讀本文大概需要 2.4 分鐘。

          作者:沉末??

          原文地址:https://juejin.im/post/6860253625030017031

          前言
          曾經(jīng)遇到的面試題,覺得挺有意思,來說下我的答案及思考過程。
          首先,我們要知道的是,圖片一般有兩種傳輸方式:base64和?file對象。

          base64 圖片

          圖片的base64編碼想必大家都見過:
          base64?的本質(zhì)是字符串,而?GET?請求的參數(shù)在?url?里面,所以直接把圖的?base64?數(shù)據(jù)放到?url?里面,就可以實現(xiàn)?GET?請求傳圖片。
          input?輸入框拿到的圖是?file?對象,圖片?file?對象轉(zhuǎn)base64?:
          // img參數(shù):file文件或者blob
          const?getBase64?=?img?=>?{
          ??return?new?Promise((resolve,reject)?=>?{
          ????const?reader?=?new?FileReader();
          ????reader.onload?=?e?=>?{
          ??????resolve(e.target.result);
          ????};
          ????reader.onerror?=?e?=>?reject(e);
          ????reader.readAsDataURL(img);
          ??})
          }
          問題來了,GET?請求的?url?長度是有限制的,不同的瀏覽器長度限制不一樣,最長的大概是 10k 左右,根據(jù)?base64的編碼原理,base64圖片大小比原文件大小大 1/3,所以說?base64?只能傳一些非常小的小圖,大圖的?base64?太長會被截斷。
          但其實這個長度限制是瀏覽器給的,而不是?GET?請求本身,也就說,在服務(wù)端,GET?請求長度理論上無限長,也就是可以傳任意大小的圖片。

          file 對象

          我們來看看這個場景:
          "http://localhost:8080/"?method="get">
          ????<input?type="file"?name="logo">
          ????<input?type="submit">
          form>

          選擇圖片,然后提交表單,能提交成功,但是接口收不到文件。請求的?url?會變成?http://localhost:8080/?logo=xxx.png,但是不會攜帶圖片數(shù)據(jù)。正常情況,file?對象數(shù)據(jù)是放在POST請求的?body?里面,并且是?form-data?編碼。
          那么?GET?請求能否有?body?體呢?答案是可以有。GET?和?POST?并沒有本質(zhì)上的區(qū)別,他們只是?HTTP?協(xié)議中兩種請求方式,僅僅是報文格式不同(或者說規(guī)范不同)。
          做過底層開發(fā)的同事可能比較熟悉,之前我們C語言的同事和我講,我們的?HTTP?請求,他們收到是這樣子的:
          舉個栗子, 一個普通的 GET 請求,他們收到是這樣的:
          GET /test/?sex=man&name=zhangsan HTTP/1.1
          Host: http://localhost:8080
          Accept: application/json, text/plain, */*
          Accept-Encoding: gzip, deflate
          Accept-Language: zh-CN,zh;q=0.9
          Connection: Keep-Alive
          POST 請求長這樣:
          POST?/add?HTTP/1.1
          Host:?http://localhost:8080
          Content-Type:?application/x-www-form-urlencoded
          Content-Length:?40
          Connection:?Keep-Alive

          sex=man&name=Professional?
          同樣,DELETEPUT、PATCH?請求,也都是這樣的報文。底層解析這個報文的時候,并不關(guān)心是什么請求,所以說GET請求也可以有body?體,也可以傳?form-data?數(shù)據(jù)。
          有興趣的可以拿 postman 試一下,看看?GET?請求傳圖片,接口能不能收到圖片文件:

          結(jié)尾

          綜上所述,GET 請求是可以傳圖片的,但是 GET 和 POST 的規(guī)范還是要遵守的,如果有后臺讓你這么做,錘他就行了!

          推薦閱讀:

          雷軍1994年寫的詩一樣的代碼,我把它運行起來了!

          Java 反射不是一點半點慢!

          5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機,樹莓派,等等。在公眾號內(nèi)回復(fù)「2048」,即可免費獲取??!

          微信掃描二維碼,關(guān)注我的公眾號

          朕已閱?

          瀏覽 51
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲性爱视频网站 | 色哟哟之蜜桃视频 - 百度 | av婷婷免费在线观看 | 欧美色视频日本免费 | 国产综合在线视频 |