将Excel文件上载到Microsoft Graph API Beta时出现文件损坏

时间:2016-05-27 19:22:03

标签: azure xlsx microsoft-graph

我们正在尝试将Microsoft Excel文件上传到OneDrive,但每次我们这样做时文件都会损坏。

我们已尝试使用[这些说明]对以下设置排列提出PUT请求:

内容编码:

  • 文本/计划
  • 应用/ vnd.openxmlformats-officedocument.spreadsheetml.sheet

POST正文:

  • 来自磁盘的XLSX文件字节
  • XLSX文件编码为UTF8字符串
  • XLSX文件编码为base64

如果我们下载上传的文件,它看起来几乎相同,但是一些二进制区域不同。

如果您愿意通过互联网打开Excel文件,我已经上传了the file we uploadcorrupted file OneDrive saves的示例。

这有一个臭虫的味道可以通过单个参数修改来修复...我只是无法弄清楚它是什么。

有人有想法吗?谢谢!

2 个答案:

答案 0 :(得分:1)

谢谢@GSM。这是我们在TypeScript中的代码。

var fileContent = FileSystem.readFileSync(localFile);
var url = `https://graph.microsoft.com/beta/me/drive/root/children/${doc.name}.xlsx:/content`,

var opts {
  url: url,
  method: 'PUT',
  headers: [
    'Content-Type': 'text/plain',
    'Authorization': token
  ],
  body: fileContent
};
var requestOpts = {
  url: `https://${domain}${opts.path}`,
  method: opts.method,
  headers: {},
};

request(opts, cb);

我看到的唯一区别是您使用备用路径上传文件,这也记录在GraphAPI页面上。如果我们使用您正在使用的路径,我们会返回错误消息:

{
  "error": {
    "code": "BadRequest",
    "message": "Entity only allows writes with a JSON Content-Type header.",
    "innerError": {
      "request-id": "2a2e7588-3217-4337-bee3-f8aff208510c",
      "date": "2016-05-30T16:35:50"
    }
  }
}

..这很奇怪,因为它让我觉得你的代码不应该有用。

更新 - 答案

通过将文件读入字符串然后将其写入定义PUT参数的JSON对象,我们就是在破坏它。我们通过简单地将文件读取流传递给打开的HTTP请求来解决问题。

答案 1 :(得分:0)

如果您发布了代码,将会更容易提供帮助。 但是,这里有一些可用于将文件上传到OneDrive的代码。我用你的文件测试了它,并且能够上传和下载就好了:

using (var client = new HttpClient())
{
    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + t.AccessToken);

    var byteContent = File.ReadAllBytes(@"C:\Temp\sheet-uploaded.xlsx");
    var url = resource + "beta/me/drive/root:/Documents/sheet-uploaded.xlsx:/content";

    var result = client.PutAsync(url, new ByteArrayContent(byteContent)).Result;
    result.Content.ReadAsStringAsync().Dump();
}