将 Excel 文件上传到 Microsoft Graph API Beta 时文件损坏
File Corruption when Uploading Excel files to Microsoft Graph API Beta
我们正在尝试将 Microsoft Excel 文件上传到 OneDrive,但每次上传时文件都会损坏。
我们已尝试使用 [这些说明] 对以下设置排列提出 PUT
请求:
内容编码:
- text/plan
- application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
POST 机构:
- 来自磁盘的原始 XLSX 文件字节数
- 编码为 UTF8 字符串的 XLSX 文件
- 编码为 base64 的 XLSX 文件
如果我们下载上传的文件,它看起来几乎一样,但一些二进制区域不同。
如果您愿意从互联网上打开 Excel 文件,我上传了一个 the file we upload and the corrupted file OneDrive saves 的示例。
这完全是一个可以通过单个参数修改来修复的错误的味道...我只是想不通它是什么。
有人有想法吗?谢谢!
如果您发布代码,会更容易提供帮助。
但是,这里有一些代码可用于将文件上传到 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();
}
谢谢@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 请求来解决了这个问题。
我们正在尝试将 Microsoft Excel 文件上传到 OneDrive,但每次上传时文件都会损坏。
我们已尝试使用 [这些说明] 对以下设置排列提出 PUT
请求:
内容编码:
- text/plan
- application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
POST 机构:
- 来自磁盘的原始 XLSX 文件字节数
- 编码为 UTF8 字符串的 XLSX 文件
- 编码为 base64 的 XLSX 文件
如果我们下载上传的文件,它看起来几乎一样,但一些二进制区域不同。
如果您愿意从互联网上打开 Excel 文件,我上传了一个 the file we upload and the corrupted file OneDrive saves 的示例。
这完全是一个可以通过单个参数修改来修复的错误的味道...我只是想不通它是什么。
有人有想法吗?谢谢!
如果您发布代码,会更容易提供帮助。 但是,这里有一些代码可用于将文件上传到 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();
}
谢谢@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 请求来解决了这个问题。