欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

正文

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

技術棧

  • React: 一個流行的JavaScript庫,用于構建用戶界面。
  • Node.js: 一個基于JavaScript運行的開放源代碼、跨平臺、輕量級的運行時環(huán)境。
  • Koa2: 一個基于Node.js平臺的Web開發(fā)框架,提供了更簡潔、更強大的API。

實現(xiàn)過程

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;

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

當文件上傳成功后,我們會在頁面上顯示一個下載鏈接,當用戶單擊該鏈接時,我們將使用axios庫從服務器下載文件,并將其保存到用戶的計算機上。

2. 后端服務(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;
  // 計算文件大小
  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());
// 啟動!
const port = process.env.PORT || 3001;
app.listen(port, () => {
  console.log(`Server started on port ${port}`);
});

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

我們使用koa-body中間件來處理文件上傳。這個中間件會將文件存儲在本地文件系統(tǒng)中,并將文件元數據附加到請求對象上。

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

我們最后將路由器連接到Koa應用程序實例,并在端口3001上啟動服務器。

現(xiàn)在我們已經完成了整個應用程序的開發(fā)。我們可以使用以下命令啟動服務器和客戶端:

// 前端
npm run start
//服務端
node server.js

這就是我們如何使用React和Node.js實現(xiàn)文件上傳進度條功能的全部過程。

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

相關文章

  • node.js中的fs.open方法使用說明

    node.js中的fs.open方法使用說明

    這篇文章主要介紹了node.js中的fs.open方法使用說明,本文介紹了fs.open方法說明、語法、接收參數、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 如何將node服務打包成可執(zhí)行文件PKG

    如何將node服務打包成可執(zhí)行文件PKG

    這篇文章主要介紹了如何將node服務打包成可執(zhí)行文件PKG問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • npm install -g 遇到權限問題解析

    npm install -g 遇到權限問題解析

    這篇文章主要為大家介紹了npm install -g 遇到權限問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • nodejs中模塊定義實例詳解

    nodejs中模塊定義實例詳解

    這篇文章主要介紹了nodejs中模塊定義方法,結合實例形式分析了nodejs模塊的原理、常見模塊及相應的定義方法,需要的朋友可以參考下
    2017-03-03
  • NodeJS落地WebSocket實踐前端架構師破局技術

    NodeJS落地WebSocket實踐前端架構師破局技術

    這篇文章主要為大家介紹了NodeJS落地WebSocket實踐前端架構師破局技術,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 一文詳解nodejs的path模塊使用

    一文詳解nodejs的path模塊使用

    這篇文章主要為大家介紹了nodejs的path模塊使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • 淺談Node.js ORM框架Sequlize之表間關系

    淺談Node.js ORM框架Sequlize之表間關系

    下面小編就為大家?guī)硪黄獪\談Node.js ORM框架Sequlize之表間關系。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 利用python分析access日志的方法

    利用python分析access日志的方法

    最近在自學python,光看是不行的,還是要多實操的。這就是一個寫給自己的小小工具。主要功能是,便利日志文件夾下的文件,根據設定的關鍵字查找是否有web攻擊行為。有需要的朋友們下面來一起看看吧。
    2016-10-10
  • 使用Node.js創(chuàng)建HTTP服務器并實現(xiàn)公網訪問本地Server的步驟

    使用Node.js創(chuàng)建HTTP服務器并實現(xiàn)公網訪問本地Server的步驟

    Node.js含有一系列內置模塊,使得程序可以脫離 Apache HTTP Server 或 IIS,作為獨立服務器運,下面將介紹如何簡單幾步實現(xiàn)遠程公共網絡下訪問windwos node.js的服務端,感興趣的朋友一起看看吧
    2023-11-11
  • 利用node.js實現(xiàn)自動生成前端項目組件的方法詳解

    利用node.js實現(xiàn)自動生成前端項目組件的方法詳解

    最近在學習用,基于nodejs的強大,我從原本的只寫前端變成了寫全棧。下面這篇文章主要給大家介紹了關于利用node.js實現(xiàn)自動生成前端項目組件的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友們下面來一起看看吧。
    2017-07-07

最新評論