Nodejs + Express如何实现大文件上传并转存到百度云存储

Nodejs + Express如何实现大文件上传并转存到百度云存储

用户html页面上传到node服务器后做中转,然后存储到百度云存储, 想问下,这中间以流的形式怎么操作,百度云存储支持刘上传

4 回复

Nodejs + Express 如何实现大文件上传并转存到百度云存储

概述

在处理大文件上传时,使用流(Stream)是一种高效且节省内存的方法。本文将介绍如何使用 Node.js 和 Express 实现大文件上传,并将其通过流的方式转存到百度云存储(Baidu Cloud Storage, BCS)。

步骤

  1. 设置前端表单:创建一个 HTML 表单用于文件上传。
  2. 配置 Express 后端:使用 Express 接收上传的文件。
  3. 使用流进行数据传输:将接收到的文件通过流的方式发送到百度云存储。

示例代码

前端 HTML
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>File Upload</title>
</head>
<body>
    <form action="/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="file" />
        <button type="submit">Upload</button>
    </form>
</body>
</html>
后端 Node.js (Express)

首先安装必要的依赖:

npm install express multer baidu-bos-node-sdk

然后编写后端代码:

const express = require('express');
const multer = require('multer');
const bos = require('baidu-bos-node-sdk');

const app = express();
const upload = multer({ dest: 'uploads/' });

// 初始化百度云存储客户端
const client = new bos.Client({
    credentials: {
        accessKeyId: 'YOUR_ACCESS_KEY_ID',
        secretAccessKey: 'YOUR_SECRET_ACCESS_KEY'
    },
    endpoint: 'http://bj.bcebos.com', // 替换为你的地域
    apiVersion: 'v1'
});

app.post('/upload', upload.single('file'), async (req, res) => {
    const fileStream = fs.createReadStream(req.file.path);
    
    try {
        await client.putObject({
            bucketName: 'your-bucket-name',
            objectKey: req.file.originalname,
            body: fileStream
        });
        
        res.status(200).send('File uploaded successfully.');
    } catch (error) {
        console.error(error);
        res.status(500).send('Error uploading file.');
    }
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  1. 前端表单:创建了一个简单的 HTML 表单,用于选择文件并提交。
  2. 后端 Express:使用 multer 中间件处理文件上传,将文件保存到本地临时目录。
  3. 百度云存储:使用 baidu-bos-node-sdk 客户端将文件流式上传到百度云存储。

通过这种方式,我们可以高效地处理大文件上传,并利用流的方式优化内存使用。


你这样问别人需要完整实现给你看才能回答你这个问题啊

额,新手,见谅,,

要实现大文件上传并通过Node.js和Express将其转存到百度云存储(如百度网盘),我们可以使用流来处理大文件。这样可以避免一次性将整个文件加载到内存中,从而减少服务器压力。下面是具体的步骤和代码示例:

步骤

  1. 设置前端表单:创建一个HTML表单用于上传文件。
  2. 设置Express路由:创建一个Express应用来接收文件,并使用流的方式将文件上传到百度云存储。
  3. 使用流处理文件:使用multer处理文件上传,通过流的方式将文件发送到百度云存储。

示例代码

前端表单 (HTML)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>File Upload</title>
</head>
<body>
    <form action="/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="file" />
        <button type="submit">Upload</button>
    </form>
</body>
</html>

Node.js 服务端代码

首先,确保安装必要的依赖:

npm install express multer
const express = require('express');
const multer = require('multer');
const FormData = require('form-data');
const axios = require('axios');

const app = express();
const upload = multer({ dest: 'uploads/' }); // 存储临时文件

app.post('/upload', upload.single('file'), async (req, res) => {
    const file = req.file;
    
    // 创建formData对象
    const formData = new FormData();
    formData.append('file', fs.createReadStream(file.path), file.originalname);

    try {
        // 发送文件到百度云存储API
        const response = await axios.post('https://your-baidu-storage-api.com/upload', formData, {
            headers: formData.getHeaders()
        });

        console.log(response.data);
        res.send('File uploaded successfully!');
    } catch (error) {
        console.error(error);
        res.status(500).send('Error uploading file.');
    }
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  1. 前端表单:简单的HTML表单用于选择和上传文件。
  2. Node.js 服务端
    • 使用multer处理文件上传,将文件保存到临时目录。
    • 将上传的文件转换为流,并通过FormData对象附加到请求中。
    • 使用axios库发送POST请求到百度云存储API,完成文件上传。

这样,我们就能够高效地处理大文件上传,并通过流的方式将文件转存到百度云存储。

回到顶部