const axios = require('axios'); const fs = require('fs'); const crypto = require('crypto'); const FormData = require('form-data'); const request = require("request") const https = require('https'); const size = 4 * 1024 * 1024 let promistlist = [] let daxiao function getsize(url) { return new Promise((res, err) => { fs.stat("./a.exe", {}, (err, stats) => { if (!err) { daxiao = stats.size let fenpian = Math.ceil(stats.size / size) res({ size: daxiao, num: fenpian }) } else { err("文件路径错误或文件不存在") } }) }) } function getfile({ i, url }) { return new Promise((res) => { let data = ''; let start = i * size let end = (i + 1) * size - 1 const stream = fs.createReadStream(url, { start, end }) stream.on('data', (chunk) => { // console.log(`接收到 ${chunk.length} 个字节的数据`); if (!data) { data = chunk } else { data = Buffer.concat([data, chunk]) } }); stream.on('end', () => { res(data) }); }) } function upgetfile({ i, url }) { i = parseInt(i) return new Promise((res) => { let data = ''; const stream = fs.createReadStream(url, { start: i * size, end: (i + 1) * size - 1 }) // res(stream) stream.on('data', (chunk) => { // console.log(`接收到 ${chunk.length} 个字节的数据`); if (!data) { data = chunk } else { data = Buffer.concat([data, chunk]) } }); stream.on('end', () => { res(data) }); }) } async function getmd5list(url, info) { promistlist = [] // fs.createReadStream for (let i = 0; i < info.num; i++) { let data = await getfile({ url, i }) const hash = crypto.createHash('md5'); hash.update(data); const md5 = hash.digest('hex'); console.log(md5); promistlist.push(md5) } return promistlist } async function precreate(info, url) { let block_list = await getmd5list(url, info) block_list = JSON.stringify(block_list) let data = { path: encodeURI('/app/服务器备份/baidu.exe'), size: info.size, isdir: 0, autoinit: 1, block_list, rtype: 1, } let str = "" for (let i in data) { str += `${i}=${data[i]}&` } axios.post('https://pan.baidu.com/rest/2.0/xpan/file?method=precreate&access_token=121.f22e108b18705600a0dc665d12cf71ae.Yngau4V98lC_hUvMGnljcSZurJnoohuPYavgk4n.HJDCoQ', str).then((res) => { upload({ url, info, uploadid: res.data.uploadid, pian: res.data.block_list }) }) } function uploadfile(i,data,uploadid){ return new Promise((r)=>{ console.log(data.length) let urls = '/rest/2.0/pcs/superfile2?' let params = { access_token: '121.f22e108b18705600a0dc665d12cf71ae.Yngau4V98lC_hUvMGnljcSZurJnoohuPYavgk4n.HJDCoQ', method: 'upload', type: "tmpfile", path: encodeURI('/app/服务器备份/baidu.exe'), uploadid, partseq: i } for (let j in params) { urls += j + '=' + params[j] + '&' } const options = { hostname: 'd.pcs.baidu.com', port: 443, path: urls, method: 'PUT', headers: { 'content-type':'multipart/form-data', 'Content-Length': data.length } }; const req = https.request(options, (res) => { console.log('状态码:', res.statusCode); console.log('请求头:', res.headers); res.on('data', (d) => { process.stdout.write(d); }); r(1) }); req.on('error', (e) => { console.error(e); }); req.write(data); req.end(); }) } async function upload({ url, info, uploadid, pian }) { for (let i of pian) { let data = await upgetfile({ url, i }) await uploadfile(i,data,uploadid) // var formData = new FormData(); // formData.append('file', data); // console.log(formData.getBuffer()) // headers['content-length'] = length; // const from = new FormData(); // // const blob = Buffer.from(data); // from.append('file', data); // axios.post('https://d.pcs.baidu.com/rest/2.0/pcs/superfile2', {file: data}, { // headers: { // 'content-type': 'multipart/form-data; boundary=----WebKitFormBoundary' + new Date().getTime() // }, // params: { // access_token: '121.f22e108b18705600a0dc665d12cf71ae.Yngau4V98lC_hUvMGnljcSZurJnoohuPYavgk4n.HJDCoQ', // method: 'upload', // type: "tmpfile", // path: encodeURI('/app/服务器备份/baidu.exe'), // uploadid, // partseq: i // } // }).then((res) => { // console.log(res) // }).catch(err => { // console.log(err) // }) // var headers = formData.getHeaders(); // formData.getLength(async function (err, length) { // if (err) { // return; // } // //设置长度,important!!! // headers['content-length'] = length; // // let $upload = axios.create({ withCredentials: false }); // // await $upload.post('https://d.pcs.baidu.com/rest/2.0/pcs/superfile2', formData, { // // headers, // // params: { // // access_token: '121.f22e108b18705600a0dc665d12cf71ae.Yngau4V98lC_hUvMGnljcSZurJnoohuPYavgk4n.HJDCoQ', // // method: 'upload', // // type: "tmpfile", // // path: encodeURI('/app/服务器备份/baidu.exe'), // // uploadid, // // partseq: i // // } // // }).then((res) => { // // console.log(res) // // }).catch(err => { // // console.log(err) // // }) // // await axios.post(data.url, formData, { headers }).then(res => { // // console.log("上传成功", res.data); // // }).catch(res => { // // console.log(res.data); // // }) // let url = 'https://d.pcs.baidu.com/rest/2.0/pcs/superfile2?' // let params = { // access_token: '121.f22e108b18705600a0dc665d12cf71ae.Yngau4V98lC_hUvMGnljcSZurJnoohuPYavgk4n.HJDCoQ', // method: 'upload', // type: "tmpfile", // path: encodeURI('/app/服务器备份/baidu.exe'), // uploadid, // partseq: i // } // for (let j in params) { // url += j + '=' + params[j] + '&' // } // request.post({ // url, formData, function(err, httpResponse, body) { // if (err) { // return console.error('upload failed:', err); // } // console.log('Upload successful! Server responded with:', body); // } // }) // }) // let urls = 'https://d.pcs.baidu.com/rest/2.0/pcs/superfile2?' // let params = { // access_token: '121.f22e108b18705600a0dc665d12cf71ae.Yngau4V98lC_hUvMGnljcSZurJnoohuPYavgk4n.HJDCoQ', // method: 'upload', // type: "tmpfile", // path: encodeURI('/app/服务器备份/baidu.exe'), // uploadid, // partseq: i // } // for (let j in params) { // urls += j + '=' + params[j] + '&' // } // // console.log(urls) // request.post({ // url: urls, form:{file: Buffer.from(data)}, function(err, httpResponse, body) { // console.log(111) // if (err) { // return console.error('upload failed:', err); // } // console.log('Upload successful! Server responded with:', body); // } // }) // formData.submit(`https://d.pcs.baidu.com/rest/2.0/pcs/superfile2?method=upload&access_token=121.f22e108b18705600a0dc665d12cf71ae.Yngau4V98lC_hUvMGnljcSZurJnoohuPYavgk4n.HJDCoQ&type=tmpfile&path=${encodeURI('/app/服务器备份/baidu.exe')}&uploadid=${uploadid}&partseq=${i}`, function(err, res) { // console.log(res.statusCode); // }); } // https://pan.baidu.com/rest/2.0/xpan/file?method=create let data = { path:encodeURI('/app/服务器备份/baidu.exe'), size: daxiao, isdir:0, rtype: 1, uploadid, block_list:JSON.stringify(promistlist) } let s = '' for(let i in data){ s += i + "=" + data[i] + '&' } console.log(s) axios.post('https://pan.baidu.com/rest/2.0/xpan/file?method=create',s,{ params:{ access_token: '121.f22e108b18705600a0dc665d12cf71ae.Yngau4V98lC_hUvMGnljcSZurJnoohuPYavgk4n.HJDCoQ', } }).then((res)=>{ console.log(res) }) } async function start(url) { let info; try { info = await getsize(url) } catch (err) { console.log(err) } console.log(info) precreate(info, url) } module.exports = { start }