OneDrive API Node.js-无法使用:/createUploadSession内容范围错误 [英] OneDrive API Node.js - Can´t use :/createUploadSession Content-Range Error
问题描述
My problem was that I couldn´t upload files bigger than 4MB so I used the createuploadsession according to createuploadsession
我从createuploadsession响应中成功获取了uploadUrl值.现在,我尝试使用此代码发出PUT请求
I successfully get the uploadUrl value from the createuploadsession response. Now I try to make a PUT request with this code
var file = 'C:\\files\\box.zip'
fs.readFile(file, function read(e, f) {
request.put({
url: 'https://api.onedrive.com/rup/545d583xxxxxxxxxxxxxxxxxxxxxxxxx',
headers: {
'Content-Type': mime.lookup(file),
'Content-Length': f.length,
'Content-Range': 'bytes ' + f.length
}
}, function(er, re, bo) {
console.log('#324324', bo);
});
});
但是如果我尝试的话,也会得到响应无效的Content-Range标头值"
But I will get as response "Invalid Content-Range header value" also if I would try
'Content-Range': 'bytes 0-' + f.length
//or
'Content-Range': 'bytes 0-' + f.length + '/' + f.length
我将得到相同的答复.
另外,我也不想对文件进行分块,我只想在1run中完整地上传文件.是否有人提供示例代码,用于将文件从createuploadsession响应上传到uploadUrl.另外,在上传大于4mb的文件之前,是否真的需要先获取此uploadurl,否则还有其他方法吗?
I will get the same response.
Also I don´t want to chunk my file I just want to upload my file complete in 1run. Does anybody have sample code for upload a file to the uploadUrl from the createuploadsession response. Also do I really need to get first this uploadurl before i can upload files bigger than 4mb or is there an alternative way?
推荐答案
如何跟踪示例脚本?
此脚本的流程如下.
- 从刷新令牌中获取访问令牌.
- 创建会话.
- 按每个块上传文件.当前块大小最大为60 * 1024 * 1024字节.您可以自由更改.
详细信息为 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();
在我的环境中,这可以正常工作.我可以使用此脚本将100 MB的文件上传到OneDrive.如果这在您的环境中不起作用,请随时告诉我.
In my environment, this works fine. I could upload a 100 MB file to OneDrive using this script. If this doesn't work at your environment, feel free to tell me.
这篇关于OneDrive API Node.js-无法使用:/createUploadSession内容范围错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!