React和Node.js怎么实现快速上传进度条功能

前端开发   发布日期:2023年09月08日   浏览次数:424

本文小编为大家详细介绍“React和Node.js怎么实现快速上传进度条功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“React和Node.js怎么实现快速上传进度条功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

技术栈

  • React: 一个流行的JavaScript库,用于构建用户界面。

  • Node.js: 一个基于JavaScript运行的开放源代码、跨平台、轻量级的运行时环境。

  • Koa2: 一个基于Node.js平台的Web开发框架,提供了更简洁、更强大的API。

实现过程

1. 前端

  1. import React, { useState } from 'react';
  2. import axios from 'axios';
  3. function UploadForm() {
  4. const [selectedFile, setSelectedFile] = useState(null);
  5. const [uploadProgress, setUploadProgress] = useState(0);
  6. const [uploadedFile, setUploadedFile] = useState(null);
  7. const handleFileSelect = (event) => {
  8. setSelectedFile(event.target.files[0]);
  9. };
  10. const handleSubmit = async (event) => {
  11. event.preventDefault();
  12. const formData = new FormData();
  13. formData.append('file', selectedFile);
  14. const config = {
  15. onUploadProgress: (progressEvent) => {
  16. const percentCompleted = Math.round(
  17. (progressEvent.loaded * 100) / progressEvent.total
  18. );
  19. setUploadProgress(percentCompleted);
  20. },
  21. };
  22. try {
  23. const response = await axios.post('/api/upload', formData, config);
  24. setUploadedFile(response.data.filename);
  25. setSelectedFile(null);
  26. setUploadProgress(0);
  27. } catch (error) {
  28. console.log(error);
  29. }
  30. };
  31. const handleDownload = async () => {
  32. try {
  33. const response = await axios.get(`/api/download?filename=${uploadedFile}`, {
  34. responseType: 'blob',
  35. });
  36. const url = window.URL.createObjectURL(new Blob([response.data]));
  37. const link = document.createElement('a');
  38. link.href = url;
  39. link.setAttribute('download', uploadedFile);
  40. document.body.appendChild(link);
  41. link.click();
  42. } catch (error) {
  43. console.log(error);
  44. }
  45. };
  46. return (
  47. <div>
  48. <form onSubmit={handleSubmit}>
  49. <input type="file" onChange={handleFileSelect} />
  50. <button type="submit">Upload</button>
  51. </form>
  52. {selectedFile && (
  53. <div>
  54. Uploading {selectedFile.name}: {uploadProgress}%
  55. </div>
  56. )}
  57. {uploadedFile && (
  58. <div>
  59. File uploaded: <a href="https://www.19jp.com">

我们首先定义了一个

  1. UploadForm
组件,它包含一个表单和一些状态变量。当用户选择文件时,我们将文件保存在状态中。当用户提交表单时,我们将使用
  1. axios
库将文件上传到服务器,并通过状态变量跟踪上传进度。如果上传成功,我们将保存文件名并将状态变量重置为初始值。

当文件上传成功后,我们会在页面上显示一个下载链接,当用户单击该链接时,我们将使用

  1. axios
库从服务器下载文件,并将其保存到用户的计算机上。

2. 后端服务(server.js)

  1. const Koa = require("koa");
  2. const Router = require("koa-router");
  3. const koaBody = require("koa-body");
  4. const cors = require("@koa/cors");
  5. const fs = require("fs");
  6. const path = require("path");
  7. const app = new Koa();
  8. const router = new Router();
  9. // 配置跨域
  10. app.use(cors());
  11. // 配置Koa Body中间件以处理文件上传
  12. app.use(
  13. koaBody({
  14. multipart: true,
  15. formidable: {
  16. uploadDir: path.join(__dirname, "uploads"),
  17. keepExtensions: true,
  18. },
  19. })
  20. );
  21. // 上传接口
  22. router.post("/api/upload", async (ctx) => {
  23. const file = ctx.request.files.file;
  24. const filename = file.name;
  25. const filepath = file.path || file.filepath;
  26. // 计算文件大小
  27. const fileSizeInBytes = fs.statSync(filepath).size;
  28. const fileSizeInMegabytes = fileSizeInBytes / (1024 * 1024);
  29. ctx.body = {
  30. filename,
  31. size: fileSizeInMegabytes.toFixed(2),
  32. };
  33. });
  34. // 下载接口
  35. router.get("/api/download", async (ctx) => {
  36. const filename = ctx.query.filename;
  37. const filepath = path.join(__dirname, "uploads", filename);
  38. const fileStream = fs.createReadStream(filepath);
  39. ctx.response.attachment(filename);
  40. ctx.body = fileStream;
  41. });
  42. app.use(router.routes());
  43. app.use(router.allowedMethods());
  44. // 启动!
  45. const port = process.env.PORT || 3001;
  46. app.listen(port, () => {
  47. console.log(`Server started on port ${port}`);
  48. });

我们首先引入所需的模块,然后创建一个Koa实例,并将其与一个路由器实例连接。我们启用CORS,以便从任何域都可以访问我们的API。

我们使用koa-body中间件来处理文件上传。这个中间件会将文件存储在本地文件系统中,并将文件元数据附加到请求对象上。

我们定义了两个路由处理程序,一个用于处理文件上传,另一个用于处理文件下载。在文件上传处理程序中,我们从请求对象中获取上传的文件,并将文件名和大小发送回客户端。在文件下载处理程序中,我们读取文件并将其发送回客户端。

我们最后将路由器连接到Koa应用程序实例,并在端口3001上启动服务器。

现在我们已经完成了整个应用程序的开发。我们可以使用以下命令启动服务器和客户端:

  1. // 前端
  2. npm run start
  3. //服务端
  4. node server.js

以上就是React和Node.js怎么实现快速上传进度条功能的详细内容,更多关于React和Node.js怎么实现快速上传进度条功能的资料请关注九品源码其它相关文章!