Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Microsoft Graph API rest调用在c#中上载大型文档_C#_Microsoft Graph Api_Onedrive - Fatal编程技术网

如何使用Microsoft Graph API rest调用在c#中上载大型文档

如何使用Microsoft Graph API rest调用在c#中上载大型文档,c#,microsoft-graph-api,onedrive,C#,Microsoft Graph Api,Onedrive,我正在使用外部.Net Web应用程序,希望了解如何使用Microsoft Graph将大型文件上载到文档库。我可以上传高达4mb的内容,但任何超过4mb的内容都会抛出错误 我知道有一个createUploadSession,但不知道如何实现它。任何帮助都将不胜感激 这就是我成功上传4mb的原因: string requestUrl = "https://graph.microsoft.com/v1.0/drives/{mydriveid}/items/root:/" + fil

我正在使用外部.Net Web应用程序,希望了解如何使用Microsoft Graph将大型文件上载到文档库。我可以上传高达4mb的内容,但任何超过4mb的内容都会抛出错误

我知道有一个
createUploadSession
,但不知道如何实现它。任何帮助都将不胜感激

这就是我成功上传4mb的原因:

string requestUrl =
    "https://graph.microsoft.com/v1.0/drives/{mydriveid}/items/root:/" +
    fileName + ":/content";

HttpClient Hclient = new HttpClient();

HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Put, requestUrl);

message.Content = new StreamContent(file.InputStream);

client.DefaultRequestHeaders
    .TryAddWithoutValidation("Content-Type",
        "application/json; odata=verbose; charset=utf-8");

HttpResponseMessage Hresponse = await client.SendAsync(message);

//if the response is 200 then read the response and retrive the GUID!
if (Hresponse.IsSuccessStatusCode)
{
    responseString = await
    Hresponse.Content.ReadAsStringAsync();
    JObject jDataRetrieved = JObject.Parse(responseString);
    strGuid = jDataRetrieved.SelectToken("eTag").ToString();

}

您可以使用客户端库来帮助您完成此操作。发件人:

System.Drawing.ImageConverter converter=新系统.Drawing.ImageConverter();
var buff=(字节[])converter.ConvertTo(Microsoft.Graph.Test.Properties.Resources.hamilton,typeof(字节[]);
使用(System.IO.MemoryStream ms=new System.IO.MemoryStream(buff))
{
//获取提供者。
//POST/v1.0/drive/items/01KGPRHTV6Y2GOVW7725BZO354PWSELRRZ:/\u hamiltion.png:/microsoft.graph.createUploadSession
//CreateUploadSession操作似乎不支持元数据中声明的选项。
var uploadSession=wait graphClient.Drive.Items[“01KGPRHTV6Y2GOVW7725BZO354PWSELRRZ”].ItemWithPath(“_hamilton.png”).CreateUploadSession().Request().PostAsync();
var maxChunkSize=320*1024;//320 KB-将其更改为块大小。默认值为5MB。
var provider=new ChunkedUploadProvider(上传会话、graphClient、ms、maxChunkSize);
//设置块请求的必要性
var chunkRequests=provider.GetUploadChunkRequests();
var readBuffer=新字节[maxChunkSize];
var trackedExceptions=新列表();
DriveItemResult=null;
//上传区块
foreach(chunkRequests中的var请求)
{
//在此处进行更新:更新进度条等。
// ...
//发送区块请求
var result=await provider.GetChunkRequestResponseAsync(请求、读取缓冲区、跟踪异常);
if(result.uploadsuccessed)
{
itemResult=result.ItemResponse;
}
}
//检查上传是否成功
if(itemResult==null)
{
//请重试上载
// ...
}
}
针对.NET客户端库的新的和改进的大文件上载 与流畅的客户端 创建上传会话

// Create upload session 
// POST /v1.0/drive/items/01KGPRHTV6Y2GOVW7725BZO354PWSELRRZ:/SWEBOKv3.pdf:/microsoft.graph.createUploadSession
var uploadSession = await graphClient.Drive.Items[itemId].ItemWithPath("SWEBOK.pdf").CreateUploadSession().Request().PostAsync();
// Create upload session 
// POST /v1.0/drive/items/01KGPRHTV6Y2GOVW7725BZO354PWSELRRZ:/SWEBOKv3.pdf:/microsoft.graph.createUploadSession
string uri = $"https://graph.microsoft.com/v1.0/drive/items/{itemId}:/SWEBOKv3.pdf:/microsoft.graph.createUploadSession";

HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, uri);
await graphClient.AuthenticationProvider.AuthenticateRequestAsync(httpRequestMessage);

// Read the session info from the response
var httpResponseMessage = await graphClient.HttpProvider.SendAsync(httpRequestMessage);
var content = await httpResponseMessage.Content.ReadAsStringAsync();
var uploadSession = graphClient.HttpProvider.Serializer.DeserializeObject<UploadSession>(content);
创建任务

// Create task
var maxChunkSize = 320 * 1024; // 320 KB - Change this to your chunk size. 5MB is the default.
var largeFileUpload = new LargeFileUpload(uploadSession, graphClient, stream, maxChunkSize);
// Create task
var maxSliceSize = 320 * 1024; // 320 KB - Change this to your chunk size. 4MB is the default.
LargeFileUploadTask<DriveItem> largeFileUploadTask = new LargeFileUploadTask<DriveItem>(uploadSession, stream, maxSliceSize);
创建上传监视器

public class MyProgress : IProgressCallback
{
    public void OnFailure(ClientException clientException)
    {
        Console.WriteLine(clientException.Message);
    }

    public void OnSuccess(DriveItem result)
    {
        Console.WriteLine("Download completed with id below");
        Console.WriteLine(result.Id);
    }

    public void UpdateProgress(long current, long max)
    {
        long percentage = (current * 100) / max ;
        Console.WriteLine("Upload in progress. " + current + " bytes of " + max + "bytes. " + percentage + " percent complete");
    }
}
// Setup the progress monitoring
IProgress<long> progress = new Progress<long>(progress =>
{
    Console.WriteLine($"Uploaded {progress} bytes of {stream.Length} bytes");
});
上传文件

uploadedFile = await largeFileUpload.ResumeAsync(new MyProgress());
UploadResult<DriveItem> uploadResult = null;
try
{
    uploadResult = await largeFileUploadTask.UploadAsync(progress);

    if (uploadResult.UploadSucceeded)
    {
        Console.WriteLine($"File Uploaded {uploadResult.ItemResponse.Id}");//Sucessful Upload
    }
}
catch (ServiceException e)
{
    Console.WriteLine(e.Message);
}
使用HTTP客户端 创建上传会话

// Create upload session 
// POST /v1.0/drive/items/01KGPRHTV6Y2GOVW7725BZO354PWSELRRZ:/SWEBOKv3.pdf:/microsoft.graph.createUploadSession
var uploadSession = await graphClient.Drive.Items[itemId].ItemWithPath("SWEBOK.pdf").CreateUploadSession().Request().PostAsync();
// Create upload session 
// POST /v1.0/drive/items/01KGPRHTV6Y2GOVW7725BZO354PWSELRRZ:/SWEBOKv3.pdf:/microsoft.graph.createUploadSession
string uri = $"https://graph.microsoft.com/v1.0/drive/items/{itemId}:/SWEBOKv3.pdf:/microsoft.graph.createUploadSession";

HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, uri);
await graphClient.AuthenticationProvider.AuthenticateRequestAsync(httpRequestMessage);

// Read the session info from the response
var httpResponseMessage = await graphClient.HttpProvider.SendAsync(httpRequestMessage);
var content = await httpResponseMessage.Content.ReadAsStringAsync();
var uploadSession = graphClient.HttpProvider.Serializer.DeserializeObject<UploadSession>(content);
//创建上传会话
//POST/v1.0/drive/items/01KGPRHTV6Y2GOVW7725BZO354PWSELRRZ:/SWEBOKv3.pdf:/microsoft.graph.createUploadSession
字符串uri=$”https://graph.microsoft.com/v1.0/drive/items/{itemId}:/SWEBOKv3.pdf:/microsoft.graph.createUploadSession”;
HttpRequestMessage HttpRequestMessage=新的HttpRequestMessage(HttpMethod.Post,uri);
等待graphClient.AuthenticationProvider.AuthenticateRequestsAsync(httpRequestMessage);
//从响应中读取会话信息
var httpResponseMessage=等待graphClient.HttpProvider.SendAsync(httpRequestMessage);
var content=await httpResponseMessage.content.ReadAsStringAsync();
var uploadSession=graphClient.HttpProvider.Serializer.DeserializeObject(内容);
创建任务

// Create task
var maxChunkSize = 320 * 1024; // 320 KB - Change this to your chunk size. 5MB is the default.
var largeFileUpload = new LargeFileUpload(uploadSession, graphClient, stream, maxChunkSize);
// Create task
var maxSliceSize = 320 * 1024; // 320 KB - Change this to your chunk size. 4MB is the default.
LargeFileUploadTask<DriveItem> largeFileUploadTask = new LargeFileUploadTask<DriveItem>(uploadSession, stream, maxSliceSize);
//创建任务
var maxSliceSize=320*1024;//320 KB-将其更改为块大小。4MB是默认值。
LargeFileUploadTask LargeFileUploadTask=新的LargeFileUploadTask(uploadSession,stream,maxSliceSize);
创建上传监视器

public class MyProgress : IProgressCallback
{
    public void OnFailure(ClientException clientException)
    {
        Console.WriteLine(clientException.Message);
    }

    public void OnSuccess(DriveItem result)
    {
        Console.WriteLine("Download completed with id below");
        Console.WriteLine(result.Id);
    }

    public void UpdateProgress(long current, long max)
    {
        long percentage = (current * 100) / max ;
        Console.WriteLine("Upload in progress. " + current + " bytes of " + max + "bytes. " + percentage + " percent complete");
    }
}
// Setup the progress monitoring
IProgress<long> progress = new Progress<long>(progress =>
{
    Console.WriteLine($"Uploaded {progress} bytes of {stream.Length} bytes");
});
//设置进度监视
i进度=新进度(进度=>
{
WriteLine($“上载的{stream.Length}字节中的{progress}字节”);
});
上传文件

uploadedFile = await largeFileUpload.ResumeAsync(new MyProgress());
UploadResult<DriveItem> uploadResult = null;
try
{
    uploadResult = await largeFileUploadTask.UploadAsync(progress);

    if (uploadResult.UploadSucceeded)
    {
        Console.WriteLine($"File Uploaded {uploadResult.ItemResponse.Id}");//Sucessful Upload
    }
}
catch (ServiceException e)
{
    Console.WriteLine(e.Message);
}
UploadResult UploadResult=null;
尝试
{
uploadResult=等待largeFileUploadTask.UploadAsync(进度);
if(uploadResult.UploadSuccessed)
{
Console.WriteLine($“文件上传{uploadResult.ItemResponse.Id}”);//上传成功
}
}
捕获(服务异常e)
{
控制台写入线(e.Message);
}

谢谢Michael!不过,我必须使用HTTP本身来实现这一点,但仍然找不到更好的解决方案。在这种情况下,请看一下实现:@halllo我相信您可以。我想已经修好了。您可以看到一个示例。@MichaelMainer我不理解自定义元数据方面的示例。道具被注释掉了。我让它工作的唯一方法是获取相应的SharePointList并添加一个新列,然后更新ListItem的字段。