Записать файл байтового массива в OneDrive - PullRequest
0 голосов
/ 09 сентября 2018

Хорошо, я выяснил, как взять файл из OneDrive для бизнеса и записать его в локальный каталог на моем компьютере со следующим кодом:

    public static async Task GetFileAsync()
    {
        var (authResult, message) = await Authentication.AquireTokenAsync();
        var httpClient = new HttpClient();
        HttpResponseMessage response;
        var request = new HttpRequestMessage(HttpMethod.Get, MainPage.fileurl);
        request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authResult.AccessToken);
        response = await httpClient.SendAsync(request);
        byte[] fileBytes = await response.Content.ReadAsByteArrayAsync();
        StorageLibrary videoLibrary = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Videos);
        string saveFolder = videoLibrary.SaveFolder.Path;
        string genName = App.Generator;
        genName = genName.Replace(" ", "-");
        string saveFileName = App.Date + "-" + App.StartTime + "-" + App.IBX + "-" + genName + ".xlsx";
        saveLocation = saveFolder + "\\" + saveFileName;

        using (MemoryStream stream = new MemoryStream())
        {
            stream.Write(fileBytes, 0, (int)fileBytes.Length);
            using (spreadsheetDoc = SpreadsheetDocument.Open(stream, true))
            {
                await Task.Run(() =>
                {
                    File.WriteAllBytes(saveLocation, stream.ToArray());
                    return TaskStatus.RanToCompletion;
                });
            }
        }
    }

После сохранения файла на локальном компьютере я смог успешно отредактировать файл и сохранить изменения.

Я выяснил, как получить его в байтовом массиве и как удалить отредактированный файл в локальной папке после создания массива. Теперь я хочу записать этот новый отредактированный файл (байтовый массив) обратно в подпапку OneDrive.

Код, который у меня есть, следующий:

    public static async Task PutFileAsync()
    {
        string genName = App.Generator;
        genName = genName.Replace(" ", "-");
        StorageLibrary videoLibrary = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Videos);
        string readFolder = videoLibrary.SaveFolder.Path;
        StorageFolder videoFolder = await StorageFolder.GetFolderFromPathAsync(readFolder);
        string readFileName = App.Date + "-" + App.StartTime + "-" + App.IBX + "-" + genName + ".xlsx";
        StorageFile readFile = await videoFolder.GetFileAsync(readFileName);            

Произведены некоторые изменения:

        var (authResult, message) = await Authentication.AquireTokenAsync();
        var httpClient = new HttpClient();
        HttpResponseMessage response;
        string posturl = MainPage.spfileurl + readFile.Name + ":/content";
        var content = JsonConvert.SerializeObject(readFile);
        var request = new HttpRequestMessage(HttpMethod.Put, posturl);
        request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authResult.AccessToken);
        request.Content = new StringContent(content, Encoding.UTF8, "application/json");
        response = await httpClient.SendAsync(request);
        var responseString = await response.Content.ReadAsStringAsync();
        await Task.Run(() =>
        {
            File.Delete(readFile.Path);
            return TaskStatus.RanToCompletion;
        });

И эта последняя часть также связана с другим моим постом .

1 Ответ

0 голосов
/ 09 сентября 2018

Вам нужно передать строку / чистый текст json как тело запроса, но не двоичный массив (в вашем случае просто прочитайте фактическое содержимое локального файла и передайте его в json).

Если вы обновляете содержимое файла, вы можете использовать update api

Другой способ: сначала удалить старый файл на диске и загрузить последний.

Добавьте работающий код на MVC на основе вашего кода ( Ключевой момент : request.Content = new ByteArrayContent ) :

 // Initialize the GraphServiceClient.
            GraphServiceClient graphClient = SDKHelper.GetAuthenticatedClient();

            var httpClient = new HttpClient();
            HttpResponseMessage response;
            //string posturl = MainPage.spfileurl + readFile.Name + ":/content";
            string posturl = "https://graph.microsoft.com/v1.0/me/drive/root:/Test.docx:/content";
            //System.IO.FileStream file = System.IO.File.Open(@"D:\TestDocs\Allin.docx", FileMode.Open);             
            //string text= System.IO.File.ReadAllText(@"D:\TestDocs\Allin.docx",Encoding.Unicode);
            //var content = JsonConvert.SerializeObject(file);
            var request1 = new HttpRequestMessage(HttpMethod.Put, posturl);
            string accessToken = await SampleAuthProvider.Instance.GetUserAccessTokenAsync();
            request1.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken);
            //request1.Content = new StringContent(content, Encoding.UTF8, "application/json");
            request1.Content = new ByteArrayContent(System.IO.File.ReadAllBytes(@"D:\TestDocs\Allin.docx"));//  StringContent(text, Encoding.UTF8); 
            response = await httpClient.SendAsync(request1);
            var responseString = await response.Content.ReadAsStringAsync();
            await Task.Run(() =>
            {
                // System.IO.File.Delete(readFile.Path);
                return TaskStatus.RanToCompletion;
            });
...