如何使用node.js上传OneDrive API文件?

5
经过一段时间的研究,我终于学会了如何使用oAuth2并使用刷新令牌创建访问令牌。但是我找不到关于上传文件的node.js示例,我只找到了这个模块https://www.npmjs.com/package/onedrive-api

但是这对我没有用,因为我收到了这个错误{error:{code:'未验证',message:'身份验证失败'}}

即使我手动输入accessToken:'xxxxxxx'结果也是相同的。但是在上传之前,我已经创建了访问令牌,所以我不知道这是否真的会成为无效的信用问题。但有趣的是,如果我从https://dev.onedrive.com/auth/msa_oauth.htm获取access token(您可以生成1小时的access token),上传功能将正常工作。 我根据这个问题的回答创建了我的授权。OneDrive Code Flow Public clients can't send a client secret - Node.js
另外,我只使用了Files.readWrite.all范围,我可能需要允许其他某些范围吗? 我的代码是:

const oneDriveAPI = require('onedrive-api');
const onedrive_json_configFile = fs.readFileSync('./config/onedrive.json', 'utf8');
const onedrive_json_config = JSON.parse(onedrive_json_configFile);
const onedrive_refresh_token = onedrive_json_config.refresh_token
const onedrive_client_secret = onedrive_json_config.client_secret
const onedrive_client_id = onedrive_json_config.client_id






// use the refresh token to create access token
request.post({
    url:'https://login.microsoftonline.com/common/oauth2/v2.0/token',
    form: {
        redirect_uri: 'http://localhost/dashboard',
        client_id: onedrive_client_id,
        client_secret: onedrive_client_secret,
        refresh_token: onedrive_refresh_token,
        grant_type: 'refresh_token'
    }
}, function(err,httpResponse,body){
if (err) {
console.log('err: ' + err)
}else{
console.log('body full: ' + body)
var temp = body.toString()
temp = temp.match(/["]access[_]token["][:]["](.*?)["]/gmi)
//console.log('temp1: ', temp)
temp = temp.join("")
temp = temp.replace('"access_token":"','')
temp = temp.replace('"','')
temp = temp.replace('\n','')
temp = temp.replace('\r','')
//console.log('temp4: ', temp)



oneDriveAPI.items.uploadSimple({
  accessToken: temp,
  filename: 'box.zip',
  parentPath: 'test',
  readableStream: fs.createReadStream('C:\\Exports\\box.zip')
})
.then((item,body) => {
console.log('item file upload OneDrive: ', item); 
console.log('body file upload OneDrive: ', body); 
// returns body of https://dev.onedrive.com/items/upload_put.htm#response 
})
.catch((err) => {
console.log('Error while uploading File to OneDrive: ', err); 
});



} // else from if (err) { from request.post
}); // request.post({ get access token with refresh token

请问您能否发送一份使用node.js上传文件到OneDrive API的示例代码?非常感谢。
备注:我也尝试过使用以下代码上传文件。
  var uri = 'https://api.onedrive.com/v1.0/drive/root:/' + 'C:/files/file.zip' + ':/content'

  var options = {
      method: 'PUT',
      uri: uri,
      headers: {
        Authorization: "Bearer " + accesstoken
      },
      json: true
    };

request(options, function (err, res, body){

if (err) {
console.log('#4224 err:', err)
}
console.log('#4224 body:', body)

});

同样的代码:'未认证' 的东西 :/
1个回答

13

以下是一个示例脚本,其流程如下:

  1. 使用刷新令牌检索访问令牌。
  2. 使用访问令牌上传文件。

当您使用此示例时,请导入文件名、客户端 ID、客户端密钥和刷新令牌。详细信息请参见https://dev.onedrive.com/items/upload_put.htm

示例脚本:

var fs = require('fs');
var mime = require('mime');
var request = require('request');

var file = 'c:/Exports/box.zip'; // Filename you want to upload on your local PC
var onedrive_folder = 'samplefolder'; // Folder name on OneDrive
var onedrive_filename = 'box.zip'; // Filename on OneDrive

request.post({
    url: 'https://login.microsoftonline.com/common/oauth2/v2.0/token',
    form: {
        redirect_uri: 'http://localhost/dashboard',
        client_id: onedrive_client_id,
        client_secret: onedrive_client_secret,
        refresh_token: onedrive_refresh_token,
        grant_type: 'refresh_token'
    },
}, function(error, response, body) {
    fs.readFile(file, function read(e, f) {
        request.put({
            url: 'https://graph.microsoft.com/v1.0/drive/root:/' + onedrive_folder + '/' + onedrive_filename + ':/content',
            headers: {
                'Authorization': "Bearer " + JSON.parse(body).access_token,
                'Content-Type': mime.lookup(file),
            },
            body: f,
        }, function(er, re, bo) {
            console.log(bo);
        });
    });
});

如果我误解了你的问题,我很抱歉。


1
你再次拯救了我的一天。非常感谢你 <3。我认为唯一缺少的是Content-Type。因为在我发布在非官方onedrive npmjs模块的顶部,他们也没有包含Content-Type。 - t33n
抱歉,你的代码只适用于小于4MB的文件。你有上传会话的可行样例代码吗?我有一些与此相关的新问题,在这里https://stackoverflow.com/questions/45684079/onedrive-api-node-js-can%C2%B4t-use-createuploadsession-content-range-error - t33n
@t33n 欢迎。谢谢你也来。我正在考虑如何上传大文件。 - Tanaike
@Tanaike:抱歉问个愚蠢的问题:我该如何获取refresh_token?我在Azure应用程序中找不到它。在Azure应用程序中,我只能看到client_idclient_secret - Saurabh Chauhan
@Tanaike:你能帮我看看这个问题吗:https://stackoverflow.com/questions/62698690/cant-access-one-drive-through-graph-api-using-azure-app 谢谢! - Saurabh Chauhan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接