真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

nodejs怎么實(shí)現(xiàn)http傳輸大文件

這篇文章主要介紹“nodejs怎么實(shí)現(xiàn)http傳輸大文件”的相關(guān)知識,小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“nodejs怎么實(shí)現(xiàn)http傳輸大文件”文章能幫助大家解決問題。

目前創(chuàng)新互聯(lián)已為數(shù)千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間網(wǎng)站運(yùn)營、企業(yè)網(wǎng)站設(shè)計(jì)、普蘭店網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

nodejs怎么實(shí)現(xiàn)http傳輸大文件

基于nodejs的http文件傳輸方案在現(xiàn)階段的前后端全棧開發(fā)中有都很重要的作用,本文我將通過幾種方案實(shí)現(xiàn)http傳輸大文件。在實(shí)現(xiàn)功能之前,我們先通過nodejs的fs模塊寫入一個大文件,并在項(xiàng)目中生成一個本地文件:

const fs = require('fs');
const writeStream = fs.createWriteStream(__dirname + "/file.txt");
for(let i = 0;i <= 100000; i++) {
  writeStream.write(`${i} —— 我是${i}號文件\n`, "utf-8");
}
writeStream.end();

nodejs怎么實(shí)現(xiàn)http傳輸大文件

以上代碼成功運(yùn)行后,在當(dāng)前的執(zhí)行目錄下將會生成一個大小為 3.2MB大小的文本文件,該文件將作為以下方案的 “大文件素材”。在列出大文件傳輸方案之前,我們先封裝后面即將用到的兩個公共方法: 文件讀取方法文件壓縮方法

// 封裝讀取文件的方法
const readFile = async (paramsData) => {
  return new Promise((resolve, reject) => {
    fs.readFile(paramsData, (err, data) => {
      if(err) {
        reject('文件讀取錯誤');
      } else {
        resolve(data);
      }
    })
  })
}

// 封裝文件壓縮方法
const gzip = async (paramsData) => {
  return new Promise((resolve, reject) => {
    zlib.gzip(paramsData, (err, result) => {
      if(err) {
        reject('文件壓縮錯誤');
      } else {
        resolve(result);
      }
    })
  })
}

1. 通過大文件在數(shù)據(jù)壓縮后傳輸

瀏覽器在發(fā)送請求時,都會攜帶 acceptaccept-* 請求頭信息,用于告訴服務(wù)器當(dāng)前瀏覽器所支持的文件類型、支持的壓縮格式列表和支持的語言。請求頭中的 Accept-Encoding 字段,用于將客戶端能夠理解的內(nèi)容編碼方式(通常是某種壓縮算法)告訴給服務(wù)端。服務(wù)端會選擇一個客戶端所支持的方式,并通過響應(yīng)頭 Content-Encoding 來通知客戶端該選擇,響應(yīng)頭告訴瀏覽器返回的 JS 腳本,是經(jīng)過 gzip 壓縮算法處理過的

// 請求頭
accept-encoding: gzip, deflate, br
// 響應(yīng)頭
cache-control: max-age=2592000 
content-encoding: gzip 
content-type: application/x-javascript

基于 Accept-EncodingContent-Encoding 字段的了解,我們來驗(yàn)證一下未開啟 gzip 和開啟 gzip 的效果。

// 實(shí)現(xiàn)一個簡單的文件讀取服務(wù)器(沒有開啟gzip)
const server = http.createServer(async (req, res) => {
  res.writeHead(200, {
    "Content-Type": "text/plain;charset=utf-8",
  });
  const buffer = await readFile(__dirname + '/file.txt');
  res.write(buffer);
  res.end();
})
server.listen(3000, () => {
  console.log(`server啟動成功`)
})

nodejs怎么實(shí)現(xiàn)http傳輸大文件

// 實(shí)現(xiàn)一個簡單的文件讀取服務(wù)器(開啟gzip)
const server = http.createServer(async(req, res) => {
  res.writeHead(200, {
    "Content-Type": "text/plain;charset=utf-8",
    "Content-Encoding": "gzip"
  });
  const buffer = await readFile(__dirname + '/file.txt');
  const gzipData = await gzip(buffer);
  res.write(gzipData);
  res.end();
})
server.listen(3000, () => {
  console.log(`server啟動成功`)
})

nodejs怎么實(shí)現(xiàn)http傳輸大文件

2. 通過數(shù)據(jù)分塊傳輸

有場景需要用從數(shù)據(jù)庫中查詢獲得的數(shù)據(jù)生成一個大的 HTML 表格的時候,或者需要傳輸大量的圖片的時候,可以通過分塊傳輸實(shí)現(xiàn)。

Transfer-Encoding: chunked
Transfer-Encoding: gzip, chunked

響應(yīng)頭 Transfer-Encoding 字段的值為 chunked,表示數(shù)據(jù)以一系列分塊的形式進(jìn)行發(fā)送。需要注意的是 Transfer-EncodingContent-Length 這兩個字段是互斥的,也就是說響應(yīng)報文中這兩個字段不能同時出現(xiàn)。

// 數(shù)據(jù)分塊傳輸
const spilitChunks = async () =>{
  const buffer = await readFile(__dirname + '/file.txt');
  const lines = buffer.toString('utf-8').split('\n');
  let [chunks, i, n] = [[], 0, lines.length];
  while(i < n) {
    chunks.push(lines.slice(i, i+= 10));
  };
  return chunks;
}
const server = http.createServer(async(req, res) => {
  res.writeHead(200, {
    "Content-Type": "text/plain;charset=utf-8",
    "Transfer-Encoding": "chunked",
    "Access-Control-Allow-Origin": "*",
  });
  const chunks = await spilitChunks();
  for(let i =0; i< chunks.length; i++) {
    setTimeout(() => {
      let content = chunks[i].join("&");
      res.write(`${content.length.toString(16)}\r\n${content}\r\n`);
    }, i * 1000);
  }
  setTimeout(() => {
    res.end();
  }, chunks.length * 1000);
})
server.listen(3000, () => {
  console.log(`server啟動成功`)
})

3. 通過數(shù)據(jù)流的形式傳輸

當(dāng)使用 Node.js 向客戶端返回大文件時,使用流的形式來返回文件流能避免處理大文件時,占用過多的內(nèi)存。具體實(shí)現(xiàn)方式如下所示。當(dāng)使用流的形式來返回文件數(shù)據(jù)時,HTTP 響應(yīng)頭 Transfer-Encoding 字段的值為 chunked,表示數(shù)據(jù)以一系列分塊的形式進(jìn)行發(fā)送。

const server = http.createServer((req, res) => {
  res.writeHead(200, {
    "Content-Type": "text/plain;charset=utf-8",
    "Content-Encoding": "gzip",
    "Transfer-Encoding": "chunked"
  });
  fs.createReadStream(__dirname + "/file.txt")
    .setEncoding("utf-8")
    .pipe(zlib.createGzip())
    .pipe(res);
})

server.listen(3000, () => {
  console.log(`server啟動成功`)
})

關(guān)于“nodejs怎么實(shí)現(xiàn)http傳輸大文件”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點(diǎn)。


名稱欄目:nodejs怎么實(shí)現(xiàn)http傳輸大文件
標(biāo)題路徑:http://weahome.cn/article/jdppjh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部