c# - 使用 Graph API 将文件(> 4MB)上传到 OneDrive

标签 c# microsoft-graph-api onedrive

我正在尝试使用图形 API 将文件上传到 OneDrive。当我上传小于 4MB 的文件时,下面的代码工作正常,但当我尝试上传大于 4MB 的文件时,它显示错误。我经历了this documentation但是,我仍然不确定如何才能完成这项工作。

以下是我对小于 4MB 的文件的工作代码。

using (var client = new HttpClient())
{
    var url = "https://graph.microsoft.com/v1.0" + $"/drives/{driveID}/items/{folderId}:/{originalFileName}:/content";
    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + GetAccessToken());

    byte[] sContents = System.IO.File.ReadAllBytes(filePath);
    var content = new ByteArrayContent(sContents);

    var response = client.PutAsync(url, content).Result.Content.ReadAsStringAsync().Result;
}

请帮忙

最佳答案

我们需要按长度(即 4MB)拆分字节数组并将它们传递给 OneDrive API。工作版本如下:

using (var client = new HttpClient())
{
    var url = "https://graph.microsoft.com/v1.0" + $"/drives/{driveID}/items/{folderId}:/{originalFileName}:/createUploadSession";
    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + GetAccessToken());

    var sessionResponse = client.PostAsync(apiUrl, null).Result.Content.ReadAsStringAsync().Result;

    byte[] sContents = System.IO.File.ReadAllBytes(filePath);
    var uploadSession = JsonConvert.DeserializeObject<UploadSessionResponse>(sessionResponse);
    string response = UploadFileBySession(uploadSession.uploadUrl, sContents);
}

UploadFileBySession如下:

private string UploadFileBySession(string url, byte[] file)
{
    int fragSize = 1024 * 1024 * 4;
    var arrayBatches = ByteArrayIntoBatches(file, fragSize);
    int start = 0;
    string response = "";

    foreach (var byteArray in arrayBatches)
    {
        int byteArrayLength = byteArray.Length;
        var contentRange = " bytes " + start + "-" + (start + (byteArrayLength - 1)) + "/" + file.Length;

        using (var client = new HttpClient())
        {
            var content = new ByteArrayContent(byteArray);
            content.Headers.Add("Content-Length", byteArrayLength.ToProperString());
            content.Headers.Add("Content-Range", contentRange);

            response = client.PutAsync(url, content).Result.Content.ReadAsStringAsync().Result;
        }

        start = start + byteArrayLength;
    }
    return response;
}

internal IEnumerable<byte[]> ByteArrayIntoBatches(byte[] bArray, int intBufforLengt)
{
    int bArrayLenght = bArray.Length;
    byte[] bReturn = null;

    int i = 0;
    for (; bArrayLenght > (i + 1) * intBufforLengt; i++)
    {
        bReturn = new byte[intBufforLengt];
        Array.Copy(bArray, i * intBufforLengt, bReturn, 0, intBufforLengt);
        yield return bReturn;
    }

    int intBufforLeft = bArrayLenght - i * intBufforLengt;
    if (intBufforLeft > 0)
    {
        bReturn = new byte[intBufforLeft];
        Array.Copy(bArray, i * intBufforLengt, bReturn, 0, intBufforLeft);
        yield return bReturn;
    }
}

UploadSessionResponse 类文件,用于在创建上传 session 时反序列化 JSON 响应

public class UploadSessionResponse
{
    public string odatacontext { get; set; }
    public DateTime expirationDateTime { get; set; }
    public string[] nextExpectedRanges { get; set; }
    public string uploadUrl { get; set; }
}

关于c# - 使用 Graph API 将文件(> 4MB)上传到 OneDrive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56335586/

相关文章:

c# - (C#) 将 PDF 转换为逐页 JPEG(动态翻页引擎需要)

python - 无法弄清楚为什么我的 azure python-webapp-graph-api 无法识别我的租户 ID

node.js - 从 Nodejs 脚本获取 Microsoft GRAPH 访问 token

javascript - 如何使用 REST API 或 javascript 将 Powerpoint 上传并创建嵌入代码到 Onedrive

C# 从字符串转换为 int 或 int32。可能的?

c# - Web 服务抛出的自定义异常未被客户端视为相同类型(使用共享程序集)

c# - 使用 File.Create() 后另一个进程正在使用的文件

office365 - 将现有电子邮件导入 Office 365,同时保留原始日期

microsoft-graph-api - 租户没有 SPO 许可证

excel - 如何覆盖网站安全证书以消除错误?