最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node.js實(shí)現(xiàn)文件上傳

 更新時(shí)間:2016年07月05日 11:40:32   作者:StrongL  
這篇文章主要介紹了Node.js實(shí)現(xiàn)文件上傳的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下

在工作中碰到了這樣的需求,需要用nodejs 來(lái)上傳文件,之前也只是知道怎么通過(guò)瀏覽器來(lái)上傳文件, 用nodejs的話(huà), 相當(dāng)于模擬瀏覽器的行為。 google 了一番之后, 明白了瀏覽器無(wú)非就是利用http協(xié)議來(lái)給服務(wù)器傳輸數(shù)據(jù), 具體協(xié)議就是《RFC 1867 - Form-based File Upload in HTML》, 在瀏覽器上通過(guò)form 表單來(lái)上傳文件就是通過(guò)這個(gè)協(xié)議,我們可以先看看瀏覽器給服務(wù)端發(fā)送了什么數(shù)據(jù), 就可以依葫蘆畫(huà)瓢的把上傳功能實(shí)現(xiàn)出來(lái)。說(shuō)起form 表單上傳文件的話(huà), 大家應(yīng)該很熟悉:

<form action="http://www.qq.com/" method="post">
<input type="text" name="text1" /><br />
<input type="text" name="text2" /><br />
<input type="submit" />
</form> 

提交時(shí), 用fiddler 抓包可以看到向服務(wù)端發(fā)出這樣的數(shù)據(jù):

POST http://www.qq.com/ HTTP/1.1
Host: www.qq.com
Content-Length: 23
Content-Type: application/x-www-form-urlencoded; charset=UTF-8

text1=hello&text2=world

值得注意的是Content-Type默認(rèn)為application/x-www-form-urlencoded,所以消息會(huì)經(jīng)過(guò)URL編碼。比如“你好”會(huì)編碼為 %E4%BD%A0%E5%A5%BD。

接下來(lái)我們看一下通過(guò)form 表單是怎么上傳的。大家應(yīng)該也不陌生:

<form action="http://www.qq.com" method="post" enctype="multipart/form-data">
<input type="file" name="myfile" />
<input type="submit" value="submit" />
</form>

然后新建一個(gè)只有hello world字樣的upload.txt文本文件上傳上去,我們?cè)俪杂胒iddler 來(lái)抓下包, 可以發(fā)現(xiàn)發(fā)送過(guò)去的數(shù)據(jù)稍微復(fù)雜了一些(已經(jīng)去掉了很多的其它沒(méi)關(guān)系的請(qǐng)求行,比如緩存控制和cookie之類(lèi)的):

POST http://www.qq.com/ HTTP/1.1
Host: www.qq.com
Content-Length: 199
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarywr3X7sXBYQQ4ZF5G

------WebKitFormBoundarywr3X7sXBYQQ4ZF5G
Content-Disposition: form-data; name="myfile"; filename="upload.txt"
Content-Type: text/plain

hello world

------WebKitFormBoundarywr3X7sXBYQQ4ZF5G--

根據(jù)RFC 1867的定義,我們需要生成一段邊界數(shù)據(jù),這個(gè)數(shù)據(jù)不能在內(nèi)容的其它地方出現(xiàn),這個(gè)可以自己定義, 在每個(gè)瀏覽器的生成算法可能都不一樣, 上面的boundary就是分隔數(shù)據(jù),生成了分隔數(shù)據(jù)之后, 就可以把分隔數(shù)據(jù)放在頭部的Content-Type里面?zhèn)魉徒o服務(wù)端, 也就是上文的 Content-Type: multipart/form-data; boundary=----WebKitFormBoundarywr3X7sXBYQQ4ZF5G, 另外,上傳的內(nèi)容,需要用分隔數(shù)據(jù)來(lái)分隔成若干個(gè)段,然后每段數(shù)據(jù)里面都有文件的文件名,還有上傳時(shí)候的name,服務(wù)端就是用這個(gè)name來(lái)接收文件,還有文件的類(lèi)型Content-Type,在這個(gè)例子里是 text/plain,如果上傳的是png圖片就是image/png。文件類(lèi)型的一個(gè)空行后就是所上傳的文件的內(nèi)容,在這個(gè)例子里也是為了容易理解所以上傳的是文本文件所以?xún)?nèi)容直接就能夠顯示出來(lái),如果上傳的是圖片文件, 因?yàn)槭嵌M(jìn)制文件,fiddler 就顯示的是亂碼。 文件的內(nèi)容結(jié)束之后就是一個(gè)空行再加上邊界數(shù)據(jù)。

了解了發(fā)送格式的細(xì)節(jié)之后, 下一步就是使用nodejs來(lái)編程實(shí)現(xiàn),簡(jiǎn)單來(lái)講, 就是按照格式把數(shù)據(jù)發(fā)送給服務(wù)端就行了。

const http = require('http');
const fs = require('fs');
//post地址為本地服務(wù)的一個(gè)php,用于測(cè)試上傳是否成功
var options = {
hostname: 'localhost',
port: 80,
path: '/get.php',
method: 'POST'
}
//生成分隔數(shù)據(jù)
var boundaryKey = '----WebKitFormBoundaryjLVkbqXtIi0YGpaB'; 
//讀取需要上傳的文件內(nèi)容
fs.readFile('./upload.txt', function (err, data) {
//拼裝分隔數(shù)據(jù)段
var payload = '--' + boundaryKey + '\r\n' + 'Content-Disposition:form-data; name="myfile"; filename="upload.txt"\r\n' + 'Content-Type:text/plain\r\n\r\n';
payload += data;
payload += '\r\n--' + boundaryKey + '--';
//發(fā)送請(qǐng)求
var req = http.request(options, function (res) {
res.setEncoding('utf8');
res.on('data', function (chunk) {
console.log('body:' + chunk);
});
});
req.on('error', function(e) {
console.error("error:"+e);
});
//把boundary、要發(fā)送的數(shù)據(jù)大小以及數(shù)據(jù)本身寫(xiě)進(jìn)請(qǐng)求
req.setHeader('Content-Type', 'multipart/form-data; boundary='+boundaryKey+'');
req.setHeader('Content-Length', Buffer.byteLength(payload, 'utf8'));
req.write(payload);
req.end();
});

本文重點(diǎn)在于了解協(xié)議并且用代碼實(shí)現(xiàn)出來(lái), 代碼組織上面還有很多優(yōu)化的地方。

最后在本地apache,簡(jiǎn)單寫(xiě)一個(gè)php來(lái)保存上傳的文件來(lái)用作測(cè)試:

<?php
$filePath = './upload.txt';
move_uploaded_file($_FILES['myfile']['tmp_name'] , $filePath);
echo "ok";
?>

另外,根據(jù)RFC 1867 還可以實(shí)現(xiàn)一次上傳多個(gè)文件的功能, 這個(gè)在這里就不詳述, 需要的話(huà)可以詳細(xì)參考RFC 1867來(lái)實(shí)現(xiàn)。

以上所述是小編給大家介紹的Node.js實(shí)現(xiàn)文件上傳,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Node.js使用express寫(xiě)接口的具體代碼

    Node.js使用express寫(xiě)接口的具體代碼

    這篇文章主要介紹了Node.js使用express寫(xiě)接口,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 詳解node HTTP請(qǐng)求客戶(hù)端 - Request

    詳解node HTTP請(qǐng)求客戶(hù)端 - Request

    Request是一個(gè)Node.jsNPM模塊,它是一個(gè)HTTP客戶(hù)端,使用簡(jiǎn)單功能確十分強(qiáng)大
    2017-05-05
  • Node.js zlib模塊之屬性、方法及使用示例詳解

    Node.js zlib模塊之屬性、方法及使用示例詳解

    zlib模塊是Node.js中用于數(shù)據(jù)壓縮和解壓縮的強(qiáng)大工具,它提供了多種壓縮算法和靈活的使用方式,包括Deflate、Gzip等,廣泛用于網(wǎng)絡(luò)傳輸和文件存儲(chǔ)中以減少數(shù)據(jù)大小,提高性能,本文給大家介紹Node.js zlib模塊屬性、方法及使用示例,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • npx的使用及原理分析

    npx的使用及原理分析

    這篇文章主要介紹了npx的使用及原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Node.js 使用 cors 中間件解決跨域問(wèn)題小結(jié)

    Node.js 使用 cors 中間件解決跨域問(wèn)題小結(jié)

    cors 是 Express 的一個(gè)第三方中間件,通過(guò)安裝和配置 cors 中間件,可以很方便地解決跨域問(wèn)題,本文介紹Node.js 使用 cors 中間件解決跨域問(wèn)題,感興趣的朋友一起看看吧
    2024-01-01
  • Windows8下搭建Node.js開(kāi)發(fā)環(huán)境教程

    Windows8下搭建Node.js開(kāi)發(fā)環(huán)境教程

    這篇文章主要介紹了Windows8下搭建Node.js開(kāi)發(fā)環(huán)境教程,Win8下安裝node.js也比較簡(jiǎn)單,只是一些權(quán)限比較麻煩,需要的朋友可以參考下
    2014-09-09
  • Node.js API詳解之 vm模塊用法實(shí)例分析

    Node.js API詳解之 vm模塊用法實(shí)例分析

    這篇文章主要介紹了Node.js API詳解之 vm模塊用法,結(jié)合實(shí)例形式分析了Node.js API中vm模塊基本功能、函數(shù)、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2020-05-05
  • Nodejs+express+html5 實(shí)現(xiàn)拖拽上傳

    Nodejs+express+html5 實(shí)現(xiàn)拖拽上傳

    文件上傳是一個(gè)比較常見(jiàn)的功能,傳統(tǒng)的選擇方式的上傳比較麻煩,需要先點(diǎn)擊上傳按鈕,然后再找到文件的路徑,然后上傳。給用戶(hù)體驗(yàn)帶來(lái)很大問(wèn)題。html5開(kāi)始支持拖拽上傳的需要的api。nodejs也是一個(gè)最近越來(lái)越流行的技術(shù),這也是自己第一次接觸nodejs。
    2014-08-08
  • Node.js獲取本機(jī)Mac地址的兩種方案

    Node.js獲取本機(jī)Mac地址的兩種方案

    有時(shí)候我們的項(xiàng)目中可能會(huì)有日志記錄的功能或者其他需要ip的功能,于是這時(shí)我們需要獲取用戶(hù)的ip地址或mac地址,下面這篇文章主要給大家介紹了關(guān)于Node.js獲取本機(jī)Mac地址的兩種方案,需要的朋友可以參考下
    2022-09-09
  • 詳解Nodejs基于mongoose模塊的增刪改查的操作

    詳解Nodejs基于mongoose模塊的增刪改查的操作

    本篇文章主要介紹了Nodejs基于mongoose模塊的增刪改查的操作,Mongoose是MongoDB的一個(gè)對(duì)象模型工具,封裝了MongoDB對(duì)文檔的的一些增刪改查等常用方法,讓NodeJS操作Mongodb數(shù)據(jù)庫(kù)變得更加靈活簡(jiǎn)單。
    2016-12-12

最新評(píng)論

临潭县| 信阳市| 五原县| 开阳县| 安国市| 绥化市| 六安市| 深州市| 石河子市| 富蕴县| 江安县| 禹州市| 巴林左旗| 北辰区| 南雄市| 涞源县| 平乐县| 原平市| 醴陵市| 肃南| 沅江市| 平泉县| 大丰市| 大新县| 扬中市| 大竹县| 白银市| 叙永县| 巴楚县| 获嘉县| 宜宾县| 简阳市| 墨竹工卡县| 扬州市| 常熟市| 日照市| 花垣县| 荔浦县| 红安县| 冕宁县| 化州市|