t33*_*33n 2 node.js http-content-range onedrive
我的问题是我无法\xc2\xb4t上传大于4MB的文件,所以我根据createuploadsession使用了createuploadsession
\n\n我成功从 createuploadsession 响应中获取 uploadUrl 值。现在我尝试使用此代码发出 PUT 请求
\n\nvar file = \'C:\\\\files\\\\box.zip\'\n\nfs.readFile(file, function read(e, f) {\n request.put({\n url: \'https://api.onedrive.com/rup/545d583xxxxxxxxxxxxxxxxxxxxxxxxx\',\n headers: {\n \'Content-Type\': mime.lookup(file),\n \'Content-Length\': f.length,\n \'Content-Range\': \'bytes \' + f.length\n }\n }, function(er, re, bo) {\n console.log(\'#324324\', bo);\n }); \n}); \nRun Code Online (Sandbox Code Playgroud)\n\n但如果我尝试的话,我也会得到“无效的内容范围标头值”响应
\n\n\'Content-Range\': \'bytes 0-\' + f.length\n//or\n\'Content-Range\': \'bytes 0-\' + f.length + \'/\' + f.length\nRun Code Online (Sandbox Code Playgroud)\n\n我会得到同样的回应。
\n另外,我不想\xc2\xb4t 想要对我的文件进行分块,我只想在 1run 内上传完整的文件。有人有从 createuploadsession 响应将文件上传到 uploadUrl 的示例代码吗?另外,我是否真的需要先获取此 uploadurl,然后才能上传大于 4mb 的文件,还是有其他方法?
下面的示例脚本怎么样?
该脚本的流程如下。
详细信息是https://dev.onedrive.com/items/upload_large_files.htm。
var fs = require('fs');
var request = require('request');
var async = require('async');
var client_id = "#####";
var redirect_uri = "#####";
var client_secret = "#####";
var refresh_token = "#####";
var file = "./sample.zip"; // Filename you want to upload.
var onedrive_folder = 'SampleFolder'; // Folder on OneDrive
var onedrive_filename = file; // If you want to change the filename on OneDrive, please set this.
function resUpload(){
request.post({
url: 'https://login.microsoftonline.com/common/oauth2/v2.0/token',
form: {
client_id: client_id,
redirect_uri: redirect_uri,
client_secret: client_secret,
grant_type: "refresh_token",
refresh_token: refresh_token,
},
}, function(error, response, body) { // Here, it creates the session.
request.post({
url: 'https://graph.microsoft.com/v1.0/drive/root:/' + onedrive_folder + '/' + onedrive_filename + ':/createUploadSession',
headers: {
'Authorization': "Bearer " + JSON.parse(body).access_token,
'Content-Type': "application/json",
},
body: '{"item": {"@microsoft.graph.conflictBehavior": "rename", "name": "' + onedrive_filename + '"}}',
}, function(er, re, bo) {
uploadFile(JSON.parse(bo).uploadUrl);
});
});
}
function uploadFile(uploadUrl) { // Here, it uploads the file by every chunk.
async.eachSeries(getparams(), function(st, callback){
setTimeout(function() {
fs.readFile(file, function read(e, f) {
request.put({
url: uploadUrl,
headers: {
'Content-Length': st.clen,
'Content-Range': st.cr,
},
body: f.slice(st.bstart, st.bend + 1),
}, function(er, re, bo) {
console.log(bo);
});
});
callback();
}, st.stime);
});
}
function getparams(){
var allsize = fs.statSync(file).size;
var sep = allsize < (60 * 1024 * 1024) ? allsize : (60 * 1024 * 1024) - 1;
var ar = [];
for (var i = 0; i < allsize; i += sep) {
var bstart = i;
var bend = i + sep - 1 < allsize ? i + sep - 1 : allsize - 1;
var cr = 'bytes ' + bstart + '-' + bend + '/' + allsize;
var clen = bend != allsize - 1 ? sep : allsize - i;
var stime = allsize < (60 * 1024 * 1024) ? 5000 : 10000;
ar.push({
bstart : bstart,
bend : bend,
cr : cr,
clen : clen,
stime: stime,
});
}
return ar;
}
resUpload();
Run Code Online (Sandbox Code Playgroud)
在我的环境中,这工作得很好。我可以使用此脚本将 100 MB 文件上传到 OneDrive。如果这在您的环境中不起作用,请随时告诉我。
| 归档时间: |
|
| 查看次数: |
2348 次 |
| 最近记录: |