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; // 4MBif (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,分片计算MD5const 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)

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/125440.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

扫地僧万能HTML模板站群:打造高效便捷的网站建设利器

扫地僧万能HTML模板站群是一款功能强大的网站建设工具&#xff0c;以其独特的特点和卓越的性能在网络开发领域广受赞誉。本文将介绍扫地僧万能HTML模板站群的几大特点&#xff0c;包括模板自动处理、一站管理、泛站独立、多套模板、蜘蛛统计、超强自定义、超强负载、简单高效、…

Achronix与您相约“2023全球AI芯片峰会”

2023全球AI芯片峰会&#xff08;GACS 2023&#xff09;将于9月14-15日在深圳市深圳湾万丽酒店举行。峰会由智一科技旗下芯东西联合智猩猩&#xff08;智东西公开课全新品牌&#xff09;联合发起主办&#xff0c;以「AI大时代 逐鹿芯世界」为主题。 届时&#xff0c;Achronix将…

【docker快速部署微服务若依管理系统(RuoYi-Cloud)】

工作原因&#xff0c;需要一个比较完整的开源项目测试本公司产品。偶然发现RuoYi-Cloud非常适合&#xff0c;它有足够多的中间件&#xff0c;而且官方提供docker安装&#xff0c;但我本人在安装过程中遇到了很多坑&#xff0c;在这里记录一下防止下次会再次遇到。 项目地址 ht…

表单引擎的自定义控件的概念与设计

基本概念 概述 控件的定义&#xff1a;用于展示或者采集数据的表单元素&#xff0c;称为控件,比如&#xff1a;文本框、下拉框、单选按钮、从表等.自定义控件&#xff1a;表单引擎提供的基础控件之外的控件称为自定义控件, 这些控件由开发人员自己定义&#xff0c;比如&#…

导入jdk源码并进行使用

jdk下载地址 JDK1.8源码下载地址 idea打开jdk项目 打开项目结构&#xff0c;进入SDK这一栏&#xff0c;选择一个使用的jdk&#xff0c;选择jdk的类路径 将类路径进行删除&#xff0c;并且添加我们自己下载的jdk中的src文件夹到类路径

Nodejs+vue+mysql网上药店购药系统 9h2k5

本毕业设计的内容是设计并且实现一个基于vue.js框架的空巢老人购药系统。采用MYSQL为数据库开发平台&#xff0c;nodejs语言&#xff0c;网络信息服务作为应用服务器。空巢老人购药系统的功能已基本实现&#xff0c;主要用户、家属、养生知识、药品信息、身体信息等。 论文主要…

海外ASO优化之如何优化游戏应用

如果我们发布了一款手机游戏或者管理了一款手机游戏&#xff0c;那么需要确保我们的手机游戏对合适的人可见&#xff0c;目的是增加应用的下载量。 1、优化游戏元数据的关键词。 Apple和Google在应用商店中为我们提供有限的空间&#xff0c;来描述手机游戏及其优势。我们需要使…

安防监控/视频汇聚/云存储/AI视频智能算法引擎系统:遛狗检测算法详解

根据最新修订发布的《中华人民共和国动物防疫法》规定&#xff1a;遛狗不栓绳&#xff0c;养狗不办证、未定期接种疫苗等行为都是违法行为。作为一个合格的“铲屎官"出门遛狗一定要牵好狗绳&#xff0c;保护他人和爱犬的安全。但就算法律明文规定&#xff0c;还是有很多人…

Android SDK 上手指南||第十一章 虚拟与物理设备

第十一章 虚拟与物理设备 在之前的文章里&#xff0c;大家已经了解了Android项目当中的基本元素、接触了用户界面的设计以及数据存储方案。接下来&#xff0c;我们将一同探索如何在物理及虚拟设备上运行自己的应用程序并与之互动。在系列文章的下一篇中&#xff0c;我们将分步…

SQL函数

函数 字符串函数数值函数日期函数流程函数 字符串函数 常用函数&#xff1a; 函数功能CONCAT(s1, s2, …, sn)字符串拼接&#xff0c;将s1, s2, …, sn拼接成一个字符串LOWER(str)将字符串全部转为小写UPPER(str)将字符串全部转为大写LPAD(str, n, pad)左填充&#xff0c;用…

【Unity3D赛车游戏优化篇】新【八】汽车实现镜头的流畅跟随,以及不同角度的切换

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

【自动化测试】之PO模式介绍及案例

目录 概念 PO三层模式&#xff1a; 1. 构建基础的 BasePage 对象层 2. 构建首页的 Page 层&#xff08;操作层&#xff09; 3.构建业务层 常用断言方法&#xff1a; 4. 构建用例集&#xff0c;执行文件&#xff0c;输出自动化测试报告 测试报告模板 概念 PO&#xff08…

webhook--详解(gitee 推送)

一、简介 webhook 是一种基于 HTTP 的回调函数&#xff0c;可在 2 个应用编程接口&#xff08;API&#xff09;之间实现轻量级的事件驱动通信。是一种新型的前后端交互方式&#xff0c;一种对客户端-服务器模式的逆转&#xff0c;在传统方法中&#xff0c;客户端从服务器请求数…

Vue3---uni-app--高德地图引用BUG

先给报错信息&#xff1a;module libs/map//libs/map_min.js is not defined, require args is /libs/map_min.js 查看我引用方法&#xff1a; 本人查阅资料发现 是 require 使用的是 commonJS方式引用说这个适配Vue2可我项目是Vue3应该使用ES6语法糖 然后我有跑了项目发现BU…

Excel数学、工程和科学计算插件:FORMULADESK Studio

如果 Excel 是您的武器 - 让我们磨砺您的剑&#xff01;为整天使用 Excel 的人们提供创新的 Excel 加载项&#xff0c;你需要这个 FORMULADESK Studio。。。 Excel 插件为任何使用 Excel 执行数学、工程和科学计算的人提供了必备工具。 * 将公式视为真正的数学方程 * 为您的公…

接口自动化测试总结

一、什么项目适合做自动化测试&#xff1f; 软件需求变动不频繁 测试脚本的稳定性决定了自动化测试的维护成本。如果软件需求变动过于频繁&#xff0c;测试人员需要根据变动的需求来更新测试用例以及相关的测试脚本&#xff0c;而脚本的维护本身就是一个代码开发的过程&#x…

快速解决 adb server version doesn‘t match this client

这个问题是由于电脑上安装了多个版本的adb工具&#xff0c;客户端和服务端的版本不一致&#xff0c;无法正常通信导致。最快的解决方法就是将Android SDK中adb复制到系统目录下。 操作步骤如下&#xff1a; 1. 查看adb版本和路径 执行adb version&#xff0c;如下&#xff0…

Python - 队列【queue】task_done()和join()基本使用

一. 前言 task_done()是Python中queue模块提供的方法&#xff0c;用于通知队列管理器&#xff0c;已经处理完了队列中的一个项目。 queue.task_done()是Queue对象的一个方法&#xff0c;它用于通知Queue对象&#xff0c;队列中的某一项已经被处理完毕。通常在使用Queue对象时…

STM32 Nucleo-144开发板开箱bring-up

文章目录 1. 开篇2. 开发环境搭建2.1 下载官方例程2.2 ST-Link安装 3. STM32F446ZE demo工程3.1 STM32F446ZE简介3.2 跑个demo试一试 1. 开篇 最近做项目&#xff0c;用到STM32F446ZET6这款MCU&#xff0c;为了赶进度&#xff0c;前期软件需要提前开发&#xff0c;于是在某宝买…

将PyCharm中的终端运行前面的PS修改成当前环境

最近使用Pycharm中的Terminal来pip安装一些pakage&#xff0c;发现Terminal运行前面的显示的是PS&#xff0c;然后输入安装指令报错。“python无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。” 解决方法&#xff1a; 只需要在pycharm的设置中修改一些termi…