Как загрузить более 4 МБ в c# с помощью остальных вызовов Microsoft Graph API - PullRequest
0 голосов
/ 28 апреля 2020

Мне не повезло, загружая более 4 МБ в OneDrive, я успешно создал папку, переименовал, удалил и даже загрузил файл размером 4 МБ или менее, однако загрузка чего-то более 4 МБ кажется немного больше сложно. Я пытался понять, глядя на это решение Как загрузить большой документ в c# с помощью остальных вызовов Microsoft Graph API

Существует два решения. Решение с большим количеством голосов предлагает длительный метод (однако функция «GetChunkRequestResponseAsyn c» устарела, и я не смог найти подходящую функцию для выполнения того же), а второе решение использует «новый LargeFileUpload», однако, когда я помещаю это в свой код (Visual Studio), он говорит мне, что существует только «LargeFileUploadTask <?>» (та же функция по внешнему виду, однако, имеет «Task» в конце. Я не понимаю, что ставить «Task» ??? ".

В любом случае, я определенно понимаю, что необходимо запросить uploadSession:

var uploadSession = await _client.Drive.Items[FolderID]
                    .ItemWithPath(Name)
                    .CreateUploadSession()
                    .Request()
                    .PostAsync();
var maxChunkSize = 320 * 1024; //320 KB chunk sizes 

, и это может включать хранение данных в байтовом массиве, например:

string FilePath = "D:\\MoreThan5MB.txt";
string path = FilePath;//Actual File Location in your hard drive       

byte[] data = System.IO.File.ReadAllBytes(path);  //Stores all data into byte array by name of "data" then "PUT to the root folder

Stream stream = new MemoryStream(data);

Но любая помощь и предложения будут с благодарностью. Если это что-то значит, вот ссылка того, кто помогает мне загрузить менее 4 МБ: Как загрузить на OneDrive с помощью Microsoft Graph Api в c# Спасибо

1 Ответ

0 голосов
/ 28 апреля 2020

Microsoft значительно упростила загрузку больших файлов, так как посты к вопросу. В настоящее время я использую MS Graph 1.21.0. Этот код должен работать с некоторыми небольшими изменениями:

    public async Task<DriveItem> UploadToFolder(
        string driveId,
        string folderId,
        string fileLocation,
        string fileName)
    {
        DriveItem resultDriveItem = null;

        using (Stream fileStream = new FileStream(
                    fileLocation,
                    FileMode.Open,
                    FileAccess.Read))
        {
            var uploadSession = await _graphServiceClient.Drives[driveId].Items[folderId]
                                    .ItemWithPath(fileName).CreateUploadSession().Request().PostAsync();

            int maxSlice = 320 * 1024;

            var largeFileUpload = new LargeFileUploadTask<DriveItem>(uploadSession, fileStream, maxSlice);

            IProgress<long> progress = new Progress<long>(x =>
            {
                _logger.LogDebug($"Uploading large file: {x} bytes of {fileStream.Length} bytes already uploaded.");
            });

            UploadResult<DriveItem> uploadResult = await largeFileUpload.UploadAsync(progress);

            resultDriveItem = uploadResult.ItemResponse;
        }

        return resultDriveItem;
    }
...