摘要:圖片二進制數(shù)據(jù)以上是截取了一個典型的格式的請求的部分,我們逐行來分析。首先第一行,很簡單,指定了值,表明了這條請求是類型的。
大多數(shù)前端工程師對于這個multipart/form-data并不陌生,當(dāng)我們需要發(fā)送二進制數(shù)據(jù)如圖片時,通常會用到這個玩意兒~我們用form表單提交數(shù)據(jù)時,會指定form元素的enctype屬性值為multipart/form-data,又或者使用html5新對象Formdata,我們用ajax發(fā)送數(shù)據(jù)時會指定content-type為multipart/form-data.
multipart/form-data數(shù)據(jù)格式
我們來看看這個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 [圖片二進制數(shù)據(jù)] --ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC-- 以上是截取了一個典型的multipart/form-data格式的http請求的部分,我們逐行來分析。 首先第一行,很簡單,指定了Content-Type值,表明了這條http請求是multipart/form-data類型的。 細心的你可能發(fā)現(xiàn)了有一個名為boundary的玩意兒,它的值是一串看起來毫無規(guī)律的字符串。 先不急,我們來看一下具體的數(shù)據(jù)~分析數(shù)據(jù)我們可以看到剛才提到的boundary值在數(shù)據(jù)體中重復(fù)出現(xiàn)了多次。沒錯,這個boundary就是用來分割不同數(shù)據(jù)塊的,當(dāng)你提交這個請求后,后臺會根據(jù)你在content-type中指定的boundary值來解析你的數(shù)據(jù)。 Content-Disposition用來表明該數(shù)據(jù)是表單數(shù)據(jù),name用來說明這塊數(shù)據(jù)塊的名稱,當(dāng)是二進制數(shù)據(jù)時,你還需指定filename,即文件名。 multipart/form-data對數(shù)據(jù)格式要求非常嚴(yán)格,換行時必須使用 ,而不是 ,分隔符boundary在使用時,必須加上"--",即--boundary ,數(shù)據(jù)體完結(jié)后,用--boundary--表明結(jié)束
稍微介紹了multipart/form-data的相關(guān)知識,我們現(xiàn)在進入重點:使用Lua來構(gòu)造multipart/form-data格式的數(shù)據(jù),并與webserver交互(在這里使用php)
我們需要使用到lua的一個模塊,socket.http(安裝引用不在本文討論范圍,請讀者自行學(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上看到類似的,提問者自稱能成功發(fā)送,但是這樣的方式,在php里只能用file_get_contents( php://input )來獲取原始數(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) } 注意:我們這里進行了字符串塊的拼接,ltn12.source.string()只能接受字符串塊,這里的拼接過程中,換行符 需要特別注意。
以上就是使用Lua構(gòu)造multipar/form-data格式數(shù)據(jù),并發(fā)送請求的全部內(nèi)容,感謝閱讀。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/22249.html
摘要:圖片二進制數(shù)據(jù)以上是截取了一個典型的格式的請求的部分,我們逐行來分析。首先第一行,很簡單,指定了值,表明了這條請求是類型的。 大多數(shù)前端工程師對于這個multipart/form-data并不陌生,當(dāng)我們需要發(fā)送二進制數(shù)據(jù)如圖片時,通常會用到這個玩意兒~我們用form表單提交數(shù)據(jù)時,會指定form元素的enctype屬性值為multipart/form-data,又或者使用html5新...
摘要:如,是類的傳輸方式,與沒有實質(zhì)區(qū)別。是測試服務(wù)器的該資源情況,不返回實體的主體部分。請求可以獲取回服務(wù)器接收到的該請求的原始報文,從而判斷路徑中的代理和防火墻是否對該條請求進行修改。為了獲取信息且不需要傳大量條件信息的接口。 前言 HTTP通信的7種方式 在HTTP通信中主要分為GET和POST。如PUT,DELETE是類POST的傳輸方式,與POST沒有實質(zhì)區(qū)別。OPTION是查看服...
閱讀 3024·2021-09-22 15:52
閱讀 2903·2019-08-30 15:55
閱讀 2700·2019-08-30 15:53
閱讀 2454·2019-08-30 13:21
閱讀 1621·2019-08-30 13:10
閱讀 2481·2019-08-26 12:09
閱讀 2564·2019-08-26 10:33
閱讀 1802·2019-08-23 18:06