成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

multipart/form-data 格式的http請(qǐng)求,以及l(fā)ua構(gòu)造實(shí)現(xiàn)

cncoder / 2451人閱讀

摘要:圖片二進(jìn)制數(shù)據(jù)以上是截取了一個(gè)典型的格式的請(qǐng)求的部分,我們逐行來(lái)分析。首先第一行,很簡(jiǎn)單,指定了值,表明了這條請(qǐng)求是類(lèi)型的。

大多數(shù)前端工程師對(duì)于這個(gè)multipart/form-data并不陌生,當(dāng)我們需要發(fā)送二進(jìn)制數(shù)據(jù)如圖片時(shí),通常會(huì)用到這個(gè)玩意兒~我們用form表單提交數(shù)據(jù)時(shí),會(huì)指定form元素的enctype屬性值為multipart/form-data,又或者使用html5新對(duì)象Formdata,我們用ajax發(fā)送數(shù)據(jù)時(shí)會(huì)指定content-type為multipart/form-data.

multipart/form-data數(shù)據(jù)格式

我們來(lái)看看這個(gè)multipart/form-data究竟有什么特別之處。


Content-Type:multipart/form-data; boundary=ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC
Host: w.sohu.com
 
--ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC
Content-Disposition: form-data;name="desc"
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
 
[......][......][......][......]...........................
--ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC
Content-Disposition: form-data;name="pic"; filename="photo.jpg"
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
 
[圖片二進(jìn)制數(shù)據(jù)]
--ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC--


以上是截取了一個(gè)典型的multipart/form-data格式的http請(qǐng)求的部分,我們逐行來(lái)分析。

首先第一行,很簡(jiǎn)單,指定了Content-Type值,表明了這條http請(qǐng)求是multipart/form-data類(lèi)型的。
細(xì)心的你可能發(fā)現(xiàn)了有一個(gè)名為boundary的玩意兒,它的值是一串看起來(lái)毫無(wú)規(guī)律的字符串。
先不急,我們來(lái)看一下具體的數(shù)據(jù)~分析數(shù)據(jù)我們可以看到剛才提到的boundary值在數(shù)據(jù)體中重復(fù)出現(xiàn)了多次。沒(méi)錯(cuò),這個(gè)boundary就是用來(lái)分割不同數(shù)據(jù)塊的,當(dāng)你提交這個(gè)請(qǐng)求后,后臺(tái)會(huì)根據(jù)你在content-type中指定的boundary值來(lái)解析你的數(shù)據(jù)。

Content-Disposition用來(lái)表明該數(shù)據(jù)是表單數(shù)據(jù),name用來(lái)說(shuō)明這塊數(shù)據(jù)塊的名稱,當(dāng)是二進(jìn)制數(shù)據(jù)時(shí),你還需指定filename,即文件名。

multipart/form-data對(duì)數(shù)據(jù)格式要求非常嚴(yán)格,換行時(shí)必須使用
,而不是
,分隔符boundary在使用時(shí),必須加上"--",即--boundary
,數(shù)據(jù)體完結(jié)后,用--boundary--表明結(jié)束

稍微介紹了multipart/form-data的相關(guān)知識(shí),我們現(xiàn)在進(jìn)入重點(diǎn):使用Lua來(lái)構(gòu)造multipart/form-data格式的數(shù)據(jù),并與webserver交互(在這里使用php)

我們需要使用到lua的一個(gè)模塊,socket.http(安裝引用不在本文討論范圍,請(qǐng)讀者自行學(xué)習(xí))

    local resbody = {}
    local reqfile= io.open(your-file-path)    
    local file_attr = lfs.attributes(your-file-path)
    local size = file_attr.size  --獲取文件大小
    local  body, code, headers, status = http.request {
            method = "POST",
            url ="http://xxxx/upload.php",
            headers = {
                ["Content-Type"] =  "multipart/form-data",
                ["Content-Length"] = size
            },
            source = ltn12.source.file(reqfile),
            sink = ltn12.sink.table(respbody)
        }

注意,以上代碼是我從stackoverflow上看到類(lèi)似的,提問(wèn)者自稱能成功發(fā)送,但是這樣的方式,在php里只能用file_get_contents( php://input )來(lái)獲取原始數(shù)據(jù)流,但是$_POST和$_FILES數(shù)組拿不到你的數(shù)據(jù),這顯然不是我們想要的。


構(gòu)造數(shù)據(jù):
    local respbody = {}
    local _file = [[--abcd]].."
"..[[Content-Disposition: form-data; name="myfile"; filename="1.jpg"]].."
"..[[Content-Type: image/jpeg]].."

"
    local _table1 = "
"..[[--abcd]].."
"..[[Content-Disposition: form-data; name="type";]].."

"..[[0]]
    local _table2 = "
"..[[--abcd]].."
"..[[Content-Disposition: form-data; name="themeName";]].."

"..[[1482753000731]]
    local _end ="
"..[[--abcd--]].."
"
    local reqfile= io.open(your-file-path)
    local file_attr = lfs.attributes(your-file-path)
    local size = file_attr.size
    local  body, code, headers, status = http.request {
        method = "POST",
        url = "http://xxxx/upload.php",
        headers = {
            ["Content-Type"] =  "multipart/form-data;boundary=abcd",
            ["Content-Length"] = size+#_file+#_table1+#_table2+#_end
        },
        source = ltn12.source.cat(ltn12.source.string(_file),ltn12.source.file(reqfile),ltn12.source.string(_table1),ltn12.source.string(_table2),ltn12.source.string(_end)),
        sink = ltn12.sink.table(respbody)
    }

注意:我們這里進(jìn)行了字符串塊的拼接,ltn12.source.string()只能接受字符串塊,這里的拼接過(guò)程中,換行符
需要特別注意。

以上就是使用Lua構(gòu)造multipar/form-data格式數(shù)據(jù),并發(fā)送請(qǐng)求的全部?jī)?nèi)容,感謝閱讀。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/50322.html

相關(guān)文章

  • multipart/form-data 格式http請(qǐng)求,以及lua構(gòu)造實(shí)現(xiàn)

    摘要:圖片二進(jìn)制數(shù)據(jù)以上是截取了一個(gè)典型的格式的請(qǐng)求的部分,我們逐行來(lái)分析。首先第一行,很簡(jiǎn)單,指定了值,表明了這條請(qǐng)求是類(lèi)型的。 大多數(shù)前端工程師對(duì)于這個(gè)multipart/form-data并不陌生,當(dāng)我們需要發(fā)送二進(jìn)制數(shù)據(jù)如圖片時(shí),通常會(huì)用到這個(gè)玩意兒~我們用form表單提交數(shù)據(jù)時(shí),會(huì)指定form元素的enctype屬性值為multipart/form-data,又或者使用html5新...

    Wuv1Up 評(píng)論0 收藏0
  • GET,POST與后端接口詳記

    摘要:如,是類(lèi)的傳輸方式,與沒(méi)有實(shí)質(zhì)區(qū)別。是測(cè)試服務(wù)器的該資源情況,不返回實(shí)體的主體部分。請(qǐng)求可以獲取回服務(wù)器接收到的該請(qǐng)求的原始報(bào)文,從而判斷路徑中的代理和防火墻是否對(duì)該條請(qǐng)求進(jìn)行修改。為了獲取信息且不需要傳大量條件信息的接口。 前言 HTTP通信的7種方式 在HTTP通信中主要分為GET和POST。如PUT,DELETE是類(lèi)POST的傳輸方式,與POST沒(méi)有實(shí)質(zhì)區(qū)別。OPTION是查看服...

    miguel.jiang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

cncoder

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<