Как указать поток для загрузки файла в OneDrive с помощью MS Graph

Я работаю с Angular 9, чтобы загрузить файл в OneDrive с помощью MS Graph.

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

Я прочитал «Загрузить или заменить содержимое DriveItem» и еще кучу документов. он говорит: Содержимое тела запроса должно быть двоичным потоком загружаемого файла.

В том же документе в разделе «Пример» (обновление существующего файла) сказано:

const stream = The contents of the file goes here.; 
let res = await client.api('/me/drive/items/{item-id}/content') .put(stream);

что бесполезно.

Я получаю файлы с объекта, я использую

onChangeFilePicker() {
    this.upload(this.filePicker.nativeElement.files)
}

который дает мне массив объектов File.

Потом пробовал много разных способов, последний

    private async uploadFile(graphClient: Client, folderItemId: string, file: File) {
      file.arrayBuffer().then((buffer: ArrayBuffer) => {
        let u8Buffer = new Uint8Array(buffer)
        graphClient
          .api(`/me/drive/items/${folderItemId}:/${file.name}:/content`)
          .post(u8Buffer.values())
            .then(response => {
                console.info('ok')
            })
            .catch(error => {
                console.error(error.stack)
            })        
      })
  }

который создает файл с двумя байтами.

У вас есть идеи, как это решить?

Я пробовал это раньше, и это сработало: string path = "D:\\LessThan4MB.txt"; байт [] данные = System.IO.File.ReadAllBytes (путь); использование (поток потока = новый поток памяти (данные)) { var item = await _client.Me.Drive.Items [ID папки] .ItemWithPath ("LessThan4MB.txt") .Content .Request() .PutAsync<DriveItem> (поток); } Вы можете попробовать этот подход с потоком памяти и запросом PutAsync<DriveItem>, чтобы увидеть, подходит ли он для вашего сценария.

Dev 16.12.2020 20:14

Я обновлю его в ответе. чтобы вы могли правильно прочитать фрагмент кода.

Dev 17.12.2020 06:25

Прочитал ваш ответ, спасибо. Это C#, поэтому я использовал аналогичные идеи в TypeScript. Но это не работает. Я продолжаю получать файл с поврежденным содержимым.

DigitalOnion 17.12.2020 15:34

@DigitalOnion Привет. Я пытаюсь загрузить файлы на один диск и не могу получить токен доступа. Можете ли вы помочь мне с тем, как вы это сделали? Я также назначил награду за вопрос, если вы ответите на него.

Lenzman 13.04.2021 11:46
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
4
1 286
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел решение, речь шла о кодировании и клиенте Graph.

Я пропустил Graph Client и пошел на чистые запросы Graph API. Для этого требуется передать токен аутентификации и собрать тело запроса. Хотя у меня были похожие результаты, они были исправлены, когда я закодировал ArrayBuffer как UInt8Array, например:

Чтобы получить токен аутентификации:

  let graphScopes = new MSALAuthenticationProviderOptions(["Files.ReadWrite.All"]);    
  let userAgentApplication = new UserAgentApplication( { auth: this.authConfiguration} )
  let authProvider = new ImplicitMSALAuthenticationProvider(userAgentApplication, graphScopes );
  
  await authProvider.getAccessToken().
  .then(
    token => {
        let headers = new HttpHeaders({
          'Content-Type':'application/json; charset=utf-8',
          'Authorization': `Bearer ${token}`
        })

Затем, чтобы преобразовать буфер массива (как предлагается в: Angular 5 HttpClient публикует необработанные двоичные данные)

      file.arrayBuffer().then( buffer => {            
          let body = new Uint8Array(buffer)
          let uIntBody = body.buffer;
          

и, наконец, сделать запрос HttpClient PUT:

async experimentHTTPPostFile(parentId: string, file: File) {    
  let graphScopes = new MSALAuthenticationProviderOptions(["Files.ReadWrite.All"]);    
  let userAgentApplication = new UserAgentApplication( { auth: this.authConfiguration} )
  let authProvider = new ImplicitMSALAuthenticationProvider(userAgentApplication, graphScopes );
  
  await authProvider.getAccessToken()
  .then(
    token => {
        let headers = new HttpHeaders({
          'Content-Type':'application/json; charset=utf-8',
          'Authorization': `Bearer ${token}`
        })

        file.arrayBuffer().then( buffer => {            
          let body = new Uint8Array(buffer)
          let uIntBody = body.buffer;
        
          let url = `${this.MS_GRAPH_BASE_URL}/me/drive/items/${parentId}:/${file.name}:/content`
          this.http.put(url, uIntBody, { headers: headers }).toPromise()
          .then(response => {
            console.info(response)
          })
          .catch(error => {
            console.error(error)
          });                
        })            
      }
  ).catch(error => {
      console.error(error)
  })
}

Он работал отлично, я тестировал PDF, JPEG и другие бинарные файлы.

Я попытался выполнить то же преобразование буфера UInt8 с Graph Client graphClient.api(...).put(...), и это не решает проблему.

Рад слышать, что приведенное выше решение помогло вам двигаться вперед.

Dev 19.12.2020 19:07

Да помогло спасибо. Похоже у темы нет хорошей или готовой документации и статьи выкатываются медленно. Еще раз спасибо.

DigitalOnion 21.12.2020 04:11

Другие вопросы по теме