【问题标题】:File Corruption when Uploading Excel files to Microsoft Graph API Beta将 Excel 文件上传到 Microsoft Graph API Beta 时文件损坏
【发布时间】:2016-05-27 19:22:02
【问题描述】:

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

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

内容编码:

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

POST 正文:

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

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

如果您愿意从 Internet 打开 Excel 文件,我已经上传了 the file we uploadcorrupted file OneDrive saves 的示例。

这具有可以通过单个参数修改来修复的所有错误气味......我只是不知道它是什么。

有人有想法吗?谢谢!

【问题讨论】:

    标签: azure xlsx microsoft-graph-api


    【解决方案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 请求来解决了这个问题。

    【讨论】:

      【解决方案2】:

      如果您发布代码,会更容易提供帮助。 但是,这里有一些可用于将文件上传到 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();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-29
        • 2020-09-27
        相关资源
        最近更新 更多