Node.js 操作百度网盘实现文件上传(小文件上传,大文件分片上传)

这篇具有很好参考价值的文章主要介绍了Node.js 操作百度网盘实现文件上传(小文件上传,大文件分片上传)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Node.js 操作百度网盘实现文件上传(小文件上传,大文件分片上传)

前提准备:获取百度网盘的授权码

https://pan.baidu.com/union/doc/al0rwqzzl

const fs = require('fs');
const crypto = require('crypto');
const path = require('path');
const FormData = require('form-data');
const axios = require('axios');

const access_token = '需要自己创建应用获取授权码'

async function readFile(filePath) {
    return new Promise((resolve, reject) => {
        fs.readFile(filePath, (err, data) => {
            if (err) {
                reject(err);
            } else {
                resolve(data);
            }
        });
    });
}

function getFileInfo(filePath) {
    return new Promise((resolve, reject) => {
        fs.stat(filePath, (err, stats) => {
            if (err) {
                reject(err);
            } else {
                resolve({
                    size: stats.size,
                    isFile: stats.isFile(),
                    name: path.basename(filePath)
                });
            }
        });
    });
}

function getSlice(filePath, start, end) {
    return new Promise((resolve, reject) => {
        const sliceStream = fs.createReadStream(filePath, {
            start,
            end
        });
        let chunk = '';
        sliceStream.on('data', (data) => {
            chunk += data;
        });
        sliceStream.on('end', () => {
            resolve(chunk);
        });
        sliceStream.on('error', (err) => {
            reject(err);
        });
    });
}

async function getFileMd5List(filePath) {
    try {
        const fileInfo = await getFileInfo(filePath);
        const sliceSize = 4 * 1024 * 1024; // 4MB

        if (fileInfo.size <= sliceSize) {
            // 如果文件小于等于4MB,直接计算整个文件的MD5并返回
            const fileData = await readFile(filePath);
            const fileMd5 = crypto.createHash('md5').update(fileData).digest('hex');
            return JSON.stringify([fileMd5]);
        } else {
            // 如果文件大于4MB,分片计算MD5
            const sectionCount = Math.ceil(fileInfo.size / sliceSize);
            const md5List = [];

            for (let i = 0; i < sectionCount; i++) {
                const sliceData = await getSlice(filePath, i * sliceSize, (i + 1) * sliceSize - 1);
                const sliceMd5 = crypto.createHash('md5').update(sliceData).digest('hex');
                md5List.push(sliceMd5);
            }
            return JSON.stringify(md5List);
        }
    } catch (error) {
        console.error('Error in getFileMd5List:', error);
        return null;
    }
}

async function uploadFileToBaidu(filePath, accessToken) {
    try {
        const fileInfo = await getFileInfo(filePath);
        let md5List = await getFileMd5List(filePath);
        console.log(md5List)
        const precreateRes = await axios.post('https://pan.baidu.com/rest/2.0/xpan/file', {
            path: '/apps/后台管理系统/' + fileInfo.name,
            size: fileInfo.size,
            isdir: fileInfo.isFile ? 0 : 1,
            rtype: 1,
            autoinit: 1,
            block_list: md5List
        }, {
            params: {
                method: 'precreate',
                access_token: accessToken
            },
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            }
        });
        const uploadId = precreateRes.data.uploadid;
        if (fileInfo.isFile && fileInfo.size <= 4 * 1024 * 1024) {
            // 小文件上传
            const form = new FormData();
            form.append('file', fs.createReadStream(filePath));
            const uploadSingle = await axios.post('https://d.pcs.baidu.com/rest/2.0/pcs/file', form, {
                    params: {
                        method: 'upload',
                        access_token: accessToken,
                        path: '/apps/后台管理系统/' + fileInfo.name,
                        ondup: 'overwrite'
                    },
                    headers: {
                        ...form.getHeaders(),
                    }
                })
            ;
            return;
        } else {
            const sliceSize = 4 * 1024 * 1024;
            const sectionCount = Math.ceil(fileInfo.size / sliceSize);
            md5List = []
            for (let i = 0; i < sectionCount; i++) {
                const form = new FormData();
                form.append('file', await getSlice(filePath, i * sliceSize, (i + 1) * sliceSize - 1));
                if (i === sectionCount - 1) {
                    form.append('file', await getSlice(filePath, i * sliceSize, fileInfo.size - 1));
                }
                const sectionItem = await axios.put('https://d.pcs.baidu.com/rest/2.0/pcs/superfile2', form, {
                    params: {
                        method: 'upload',
                        access_token: accessToken,
                        type: 'tmpfile',
                        path: '/apps/后台管理系统/' + fileInfo.name,
                        uploadid: uploadId,
                        partseq: i
                    },
                    headers: {
                        ...form.getHeaders(),
                    }
                });
                md5List.push(sectionItem.data.md5)
            }
            console.log(md5List)
            const uploadArray = await axios.post('https://pan.baidu.com/rest/2.0/xpan/file', {
                path: '/apps/后台管理系统/' + fileInfo.name,
                size: fileInfo.size,
                isdir: fileInfo.isFile ? 0 : 1,
                uploadid: uploadId,
                block_list: JSON.stringify(md5List)
            }, {
                params: {
                    method: 'create',
                    access_token: accessToken
                },
                headers: {
                    'User-Agent': 'pan.baidu.com',
                    'Content-Type': 'application/x-www-form-urlencoded',
                },
            });
            console.log(uploadArray.data)
        }
    } catch (e) {
        console.log('error', e)
    }
}

// uploadFileToBaidu(path.resolve(__dirname, './WeChatProjects.zip'), access_token)
// uploadFileToBaidu(path.resolve(__dirname, './auth.js'), access_token)

Node.js 操作百度网盘实现文件上传(小文件上传,大文件分片上传),node.js
Node.js 操作百度网盘实现文件上传(小文件上传,大文件分片上传),node.js文章来源地址https://www.toymoban.com/news/detail-707397.html

到了这里,关于Node.js 操作百度网盘实现文件上传(小文件上传,大文件分片上传)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 服务器如何下载百度网盘文件?Linux服务器如何在百度网盘中连接、上传下载;在Linux服务器上下载百度云盘中的资料

    服务器如何下载百度网盘文件?Linux服务器如何在百度网盘中连接、上传下载;在Linux服务器上下载百度云盘中的资料

    百度云提供Python包bypy进行远程服务器的对接然后下载: https://github.com/houtianze/bypy 可以通过pip直接下载,授权本人的百度云账号后,就可以直接使Linux电脑本地文件与百度网盘的apps(我的应用数据)/bypy目录下的文件进行上传与下载的交互了。 本文简单介绍其相关的使用方式

    2024年02月06日
    浏览(10)
  • Minio文件分片上传实现

    Minio文件分片上传实现

    资源准备 MacM1Pro 安装Parallels19.1.0请参考 https://blog.csdn.net/qq_41594280/article/details/135420241 MacM1Pro Parallels安装CentOS7.9请参考 https://blog.csdn.net/qq_41594280/article/details/135420461 部署Minio和整合SpringBoot请参考 https://blog.csdn.net/qq_41594280/article/details/135613722 Minio Paralles虚拟机文件百度网盘获取

    2024年01月21日
    浏览(6)
  • Java实现文件分片上传

    Java实现文件分片上传

    Java实现文件分片上传 为什么要使用分片上传 在需要上传文件时,不可避免地会遇到上传文件内容过大,上传时间太长地问题,采用文件分片上传就可以解决这个问题。 什么是分片上传? 简单的说就是本来是需要一次搬一个很大的东西,比如是一大桶水,一次搬起来比较费

    2024年02月08日
    浏览(5)
  • springboot实现minio文件分片上传

    在Spring Boot中实现MinIO的文件分片上传涉及到几个关键步骤。MinIO是一个高性能的分布式对象存储服务,它兼容Amazon S3的API。分片上传主要用于上传大文件,将大文件分成多个部分,分别上传,最后再将这些部分合并成一个完整的文件。这样做的好处是提高了上传的可靠性,并

    2024年01月17日
    浏览(9)
  • React 实现文件分片上传和下载

    文件分片上传是一种将大文件分割成多个小片段进行上传的技术。它的原理是将大文件切割成固定大小的小块,然后逐个上传这些小块,最后在服务器端将这些小块合并成完整的文件。 文件分片上传的机制可以提高上传速度和稳定性。由于大文件的上传可能会受到网络不稳定

    2024年02月13日
    浏览(6)
  • 基于element UI 实现大文件分片上传

    将文件进行切片,上传至服务器,上传完成后通知服务器进行合并 屏幕录制2022-11-11 16.40.06 测试用例 s-upload s-upload-img

    2024年02月01日
    浏览(7)
  • uniapp微信小程序实现大文件上传 分片上传 进度条

    uniapp微信小程序实现大文件上传 分片上传 进度条

    一、安装   二、页面引入  三、实现功能(重要)         1.获取图片的路径         2.设置分片的大小         3.将数据放入 四、实现上传进度条 全部函数js 五、修改npm的源码,处理请求源码中请求所携带的参数问题,以及报错处理(重要) 修改npm后的源码。

    2024年02月03日
    浏览(10)
  • Minio大文件分片上传、断点续传实现

    Minio大文件分片上传、断点续传实现

    使用minio api实现分片上传及断点续传功能。 前端准备:获取大文件的MD5值,将文件分片,5M为一分片,排好顺序,并按顺序命名(1,2,3这种后面比较好合并) 在上传分片阶段,前端有上传进度条 1、检验文件MD5值 1.1 redis中查看MD5是否存在 1.2 判断临时文件夹是否存在 boolean d

    2024年02月09日
    浏览(7)
  • 大文件分片上传的实现【前后台完整版】

    在一般的产品开发过程中,大家多少会遇到上传视频功能的需求,往往我们采用的都是对视频大小进行限制等方法,来防止上传请求超时,导致上传失败。这时候可能将视频分片上传可以对你的项目有一个小小的体验优化。 本片文章前端是vue,后台基于PHP进行的分片上传,需

    2024年02月10日
    浏览(5)
  • node.js - 上传文件至阿里云oss

    deploy.js

    2024年02月08日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包