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

React和Node.js快速上傳進(jìn)度條功能實(shí)現(xiàn)

 更新時(shí)間:2023年03月17日 14:25:50   作者:XinD  
這篇文章主要為大家介紹了React和Node.js快速上傳進(jìn)度條功能實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

在現(xiàn)代的Web應(yīng)用程序中,文件上傳是一個(gè)很常見(jiàn)的需求。上傳進(jìn)度條是一種用于告知用戶上傳進(jìn)度的工具,它可以讓用戶了解上傳進(jìn)度,以便他們可以知道何時(shí)可以繼續(xù)執(zhí)行其他任務(wù)。在本教程中,我們將學(xué)習(xí)如何使用React和Node.js實(shí)現(xiàn)上傳進(jìn)度條功能。

技術(shù)棧

  • React: 一個(gè)流行的JavaScript庫(kù),用于構(gòu)建用戶界面。
  • Node.js: 一個(gè)基于JavaScript運(yùn)行的開(kāi)放源代碼、跨平臺(tái)、輕量級(jí)的運(yùn)行時(shí)環(huán)境。
  • Koa2: 一個(gè)基于Node.js平臺(tái)的Web開(kāi)發(fā)框架,提供了更簡(jiǎn)潔、更強(qiáng)大的API。

實(shí)現(xiàn)過(guò)程

1. 前端

import React, { useState } from 'react';
import axios from 'axios';
function UploadForm() {
  const [selectedFile, setSelectedFile] = useState(null);
  const [uploadProgress, setUploadProgress] = useState(0);
  const [uploadedFile, setUploadedFile] = useState(null);
  const handleFileSelect = (event) => {
    setSelectedFile(event.target.files[0]);
  };
  const handleSubmit = async (event) => {
    event.preventDefault();
    const formData = new FormData();
    formData.append('file', selectedFile);
    const config = {
      onUploadProgress: (progressEvent) => {
        const percentCompleted = Math.round(
          (progressEvent.loaded * 100) / progressEvent.total
        );
        setUploadProgress(percentCompleted);
      },
    };
    try {
      const response = await axios.post('/api/upload', formData, config);
      setUploadedFile(response.data.filename);
      setSelectedFile(null);
      setUploadProgress(0);
    } catch (error) {
      console.log(error);
    }
  };
  const handleDownload = async () => {
    try {
      const response = await axios.get(`/api/download?filename=${uploadedFile}`, {
        responseType: 'blob',
      });
      const url = window.URL.createObjectURL(new Blob([response.data]));
      const link = document.createElement('a');
      link.href = url;
      link.setAttribute('download', uploadedFile);
      document.body.appendChild(link);
      link.click();
    } catch (error) {
      console.log(error);
    }
  };
  return (
    <div>
      <form onSubmit={handleSubmit}>
        <input type="file" onChange={handleFileSelect} />
        <button type="submit">Upload</button>
      </form>
      {selectedFile && (
        <div>
          Uploading {selectedFile.name}: {uploadProgress}%
        </div>
      )}
      {uploadedFile && (
        <div>
          File uploaded: <a href="#" rel="external nofollow"  onClick={handleDownload}>{uploadedFile}</a>
        </div>
      )}
    </div>
  );
}
export default UploadForm;

我們首先定義了一個(gè)UploadForm組件,它包含一個(gè)表單和一些狀態(tài)變量。當(dāng)用戶選擇文件時(shí),我們將文件保存在狀態(tài)中。當(dāng)用戶提交表單時(shí),我們將使用axios庫(kù)將文件上傳到服務(wù)器,并通過(guò)狀態(tài)變量跟蹤上傳進(jìn)度。如果上傳成功,我們將保存文件名并將狀態(tài)變量重置為初始值。

當(dāng)文件上傳成功后,我們會(huì)在頁(yè)面上顯示一個(gè)下載鏈接,當(dāng)用戶單擊該鏈接時(shí),我們將使用axios庫(kù)從服務(wù)器下載文件,并將其保存到用戶的計(jì)算機(jī)上。

2. 后端服務(wù)(server.js)

const Koa = require("koa");
const Router = require("koa-router");
const koaBody = require("koa-body");
const cors = require("@koa/cors");
const fs = require("fs");
const path = require("path");
const app = new Koa();
const router = new Router();
// 配置跨域
app.use(cors());
// 配置Koa Body中間件以處理文件上傳
app.use(
  koaBody({
    multipart: true,
    formidable: {
      uploadDir: path.join(__dirname, "uploads"),
      keepExtensions: true,
    },
  })
);
// 上傳接口
router.post("/api/upload", async (ctx) => {
  const file = ctx.request.files.file;
  const filename = file.name;
  const filepath = file.path || file.filepath;
  // 計(jì)算文件大小
  const fileSizeInBytes = fs.statSync(filepath).size;
  const fileSizeInMegabytes = fileSizeInBytes / (1024 * 1024);
  ctx.body = {
    filename,
    size: fileSizeInMegabytes.toFixed(2),
  };
});
// 下載接口
router.get("/api/download", async (ctx) => {
  const filename = ctx.query.filename;
  const filepath = path.join(__dirname, "uploads", filename);
  const fileStream = fs.createReadStream(filepath);
  ctx.response.attachment(filename);
  ctx.body = fileStream;
});
app.use(router.routes());
app.use(router.allowedMethods());
// 啟動(dòng)!
const port = process.env.PORT || 3001;
app.listen(port, () => {
  console.log(`Server started on port ${port}`);
});

我們首先引入所需的模塊,然后創(chuàng)建一個(gè)Koa實(shí)例,并將其與一個(gè)路由器實(shí)例連接。我們啟用CORS,以便從任何域都可以訪問(wèn)我們的API。

我們使用koa-body中間件來(lái)處理文件上傳。這個(gè)中間件會(huì)將文件存儲(chǔ)在本地文件系統(tǒng)中,并將文件元數(shù)據(jù)附加到請(qǐng)求對(duì)象上。

我們定義了兩個(gè)路由處理程序,一個(gè)用于處理文件上傳,另一個(gè)用于處理文件下載。在文件上傳處理程序中,我們從請(qǐng)求對(duì)象中獲取上傳的文件,并將文件名和大小發(fā)送回客戶端。在文件下載處理程序中,我們讀取文件并將其發(fā)送回客戶端。

我們最后將路由器連接到Koa應(yīng)用程序?qū)嵗?,并在端?001上啟動(dòng)服務(wù)器。

現(xiàn)在我們已經(jīng)完成了整個(gè)應(yīng)用程序的開(kāi)發(fā)。我們可以使用以下命令啟動(dòng)服務(wù)器和客戶端:

// 前端
npm run start
//服務(wù)端
node server.js

這就是我們?nèi)绾问褂肦eact和Node.js實(shí)現(xiàn)文件上傳進(jìn)度條功能的全部過(guò)程。

以上就是React和Node.js快速上傳進(jìn)度條功能實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于React Node.js上傳進(jìn)度條的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Nodejs核心模塊之net和http的使用詳解

    Nodejs核心模塊之net和http的使用詳解

    net和http模塊都是node核心模塊之一,他們都可以搭建自己的服務(wù)端和客戶端,以響應(yīng)請(qǐng)求和發(fā)送請(qǐng)求。這篇文章主要介紹了Nodejs核心模塊之net和http的使用詳解,感興趣的小伙伴們可以參考一下
    2019-04-04
  • 基于Nodejs利用socket.io實(shí)現(xiàn)多人聊天室

    基于Nodejs利用socket.io實(shí)現(xiàn)多人聊天室

    這篇文章講述了websocket無(wú)到有,根據(jù)協(xié)議,分析數(shù)據(jù)幀的頭,進(jìn)行構(gòu)建websocket。雖然代碼短,但可以很好地體現(xiàn)websocket的原理。對(duì)nodejs利用socket 實(shí)現(xiàn)多人聊天室功能感興趣的朋友一起看看吧
    2017-02-02
  • 如何在NestJS中添加對(duì)Stripe的WebHook驗(yàn)證詳解

    如何在NestJS中添加對(duì)Stripe的WebHook驗(yàn)證詳解

    這篇文章主要為大家介紹了如何在NestJS中添加對(duì)Stripe的WebHook驗(yàn)證詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 在Node.js中實(shí)現(xiàn)獲取用戶頻道信息的功能

    在Node.js中實(shí)現(xiàn)獲取用戶頻道信息的功能

    在構(gòu)建社交或視頻分享平臺(tái)時(shí),允許用戶查看其他用戶的頻道信息是一個(gè)基本需求,本文將介紹如何在Node.js應(yīng)用中,使用Express框架和Mongoose庫(kù)來(lái)實(shí)現(xiàn)這一功能,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-04-04
  • 詳解nodejs微信公眾號(hào)開(kāi)發(fā)——4.自動(dòng)回復(fù)各種消息

    詳解nodejs微信公眾號(hào)開(kāi)發(fā)——4.自動(dòng)回復(fù)各種消息

    這篇文章主要介紹了詳解nodejs微信公眾號(hào)開(kāi)發(fā)——4.自動(dòng)回復(fù)各種消息,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-04-04
  • 使用Nodejs?實(shí)現(xiàn)一個(gè)簡(jiǎn)單的?Redis客戶端(推薦)

    使用Nodejs?實(shí)現(xiàn)一個(gè)簡(jiǎn)單的?Redis客戶端(推薦)

    在nodejs中支持TCP連接的是net模塊,?其中使用createConnection(config)或者直接new?Socket(config)來(lái)初始化一個(gè)TCP連接,這篇文章主要介紹了用Nodejs?實(shí)現(xiàn)一個(gè)簡(jiǎn)單的?Redis客戶端,需要的朋友可以參考下
    2022-11-11
  • Nodejs訪問(wèn)網(wǎng)絡(luò)并解析返回的json的實(shí)現(xiàn)方法

    Nodejs訪問(wèn)網(wǎng)絡(luò)并解析返回的json的實(shí)現(xiàn)方法

    本文主要介紹了Nodejs訪問(wèn)網(wǎng)絡(luò)并解析返回的json的實(shí)現(xiàn)方法,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Node 切片拼接及地圖導(dǎo)出實(shí)例詳解

    Node 切片拼接及地圖導(dǎo)出實(shí)例詳解

    這篇文章主要為大家介紹了Node 切片拼接及地圖導(dǎo)出實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 一文帶你了解前端包管理工具npm、yarn和pnpm

    一文帶你了解前端包管理工具npm、yarn和pnpm

    如果您是前端開(kāi)發(fā)人員,您將接觸到一些包管理工具,包管理工具是連續(xù)自動(dòng)化程序的集合,例如安裝、升級(jí)、配置和刪除程序,下面這篇文章主要給大家介紹了關(guān)于前端包管理工具npm、yarn和pnpm的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • 詳解autojs的nodejs編寫(xiě)UI技巧示例

    詳解autojs的nodejs編寫(xiě)UI技巧示例

    這篇文章主要為大家介紹了autojs的nodejs編寫(xiě)UI技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01

最新評(píng)論

淮南市| 梁河县| 长葛市| 织金县| 扎囊县| 大化| 天祝| 乌苏市| 溧阳市| 常州市| 扎鲁特旗| 铜山县| 喀喇沁旗| 阳原县| 商南县| 成都市| 建始县| 静宁县| 克拉玛依市| 周宁县| 肃北| 武城县| 中山市| 卢氏县| 桐乡市| 和硕县| 宁都县| 麻江县| 南宁市| 调兵山市| 布拖县| 呼伦贝尔市| 衢州市| 怀柔区| 隆安县| 葫芦岛市| 新丰县| 石台县| 天气| 平昌县| 喀喇沁旗|