gpt4 book ai didi

microsoft-graph-api - Microsoft Graph DriveItem 内容流?

转载 作者:行者123 更新时间:2023-12-05 03:33:07 27 4
gpt4 key购买 nike

我希望能够使用 Graph 下载大文件。为此,我需要将文件“分块”,因为它太大而无法放入可用内存。不幸的是,我知道的唯一调用是立即将整个文件读入内存。有没有办法避免这种情况?我应该使用什么电话?

我正在使用的电话是:

graphClient.Drives[driveId].Items[itemId].Content.Request().GetAsync()

我想使用具有缓冲区大小的“CopyToAsync”将此流发送到我的响应流,但它在我可以之前因内存异常而爆炸。据说在实际的 REST 调用中有一个“范围”选项,但我还没有想出在使用“GraphServiceClient”时如何使用它。

如有任何帮助,我们将不胜感激!

最佳答案

可以得到文件的下载地址,分块下载。

获取 DriveItem 并从元数据中读取 downloadUrl, size。使用 downloaUrlRange header 指定要下载的字节范围。

private async Task DonwloadLargeFile()
{
long defaultChunkSize = 50 * 1024;

var driveItem = await client.Drives["driveId"].Items["itemId"].Request().GetAsync();

driveItem.AdditionalData.TryGetValue("@microsoft.graph.downloadUrl", out var downloadUrl);

var size = (long)driveItem.Size;
var numberOfChunks = Convert.ToInt32(size / defaultChunkSize);
var lastChunkSize = Convert.ToInt32(size % defaultChunkSize) - numberOfChunks - 1;
if (lastChunkSize > 0)
{
numberOfChunks++;
}

using (var fs = System.IO.File.Create(Path.Combine(@"C:\Download",driveItem.Name)))
{
var chunkSize = defaultChunkSize;
long offset = 0;
byte[] buffer;
for (int i = 0; i < numberOfChunks; i++)
{
if (i == numberOfChunks - 1)
{
chunkSize = lastChunkSize;
}

var req = new HttpRequestMessage(HttpMethod.Get, (string)downloadUrl);
req.Headers.Range = new RangeHeaderValue(offset, chunkSize + offset);

var response = await client.HttpProvider.SendAsync(req);
using (var rs = await response.Content.ReadAsStreamAsync())
{
buffer = new byte[chunkSize];
int read;
do
{
read = rs.Read(buffer, 0, buffer.Length);
if (read > 0)
{
fs.Write(buffer, 0, buffer.Length);
}
}
while (read > 0);
}
offset += chunkSize + 1;
}
}
}

关于microsoft-graph-api - Microsoft Graph DriveItem 内容流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70370899/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com