node.js - OneDrive API Node.js - 无法使用 :/createUploadSession Content-Range Error

标签 node.js onedrive http-content-range

我的问题是我无法上传大于 4MB 的文件,因此我根据 createuploadsession 使用了 createuploadsession

我成功从 createuploadsession 响应中获取 uploadUrl 值。现在我尝试使用此代码发出 PUT 请求

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);
    }); 
}); 

但是如果我尝试的话,我也会得到“无效的内容范围 header 值”响应

'Content-Range': 'bytes 0-' + f.length
//or
'Content-Range': 'bytes 0-' + f.length + '/' + f.length

我会得到同样的回复。
另外,我不想分块我的文件,我只想在 1run 内上传完整的文件。有人有从 createuploadsession 响应将文件上传到 uploadUrl 的示例代码吗?另外,我是否真的需要先获取此 uploadurl,然后才能上传大于 4mb 的文件,还是有其他方法?

最佳答案

下面的示例脚本怎么样?

该脚本的流程如下。

  1. 从刷新 token 中检索访问 token 。
  2. 创建 session 。
  3. 按每个 block 上传文件。当前 block 大小最大为 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。如果这在您的环境中不起作用,请随时告诉我。

关于node.js - OneDrive API Node.js - 无法使用 :/createUploadSession Content-Range Error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45684079/

相关文章:

node.js - Docker 容器中的 Gulp 命令代码 139

node.js - Google API服务帐户和nodejs

java - 从 Java 应用程序将文件上传到 OneDrive

C# 下载带简历的文件(Content-Range)

javascript - jPlayer seekable 在 IE 中不工作

mysql - 在事务中插入多行,如果其中一行失败,则插入其余行

javascript - 使用nodejs的请求模块进行http认证返回未定义的主体

ios - 无法在 swift 中导入桥接头文件

onedrive - 错误 : Public clients can't send a client secret while try to get access token in Onedrive

php - Chrome 问题 - 视频流和 session 冲突