2016-06-23 2 views
0

Der Versuch, eine Datei mit dem .NET SDK für Microsoft Graph hochzuladen. Hier ist der Code:.NET Graph SDK - OneDrive-Datei-Upload schlägt mit "Nicht unterstützter Segmenttyp" fehl

DriveItem file = new DriveItem() 
     { 
      File = new Microsoft.Graph.File(), 
      Name = filename, 
      ParentReference = new ItemReference() 
      { 
       DriveId = parent.ParentReference.DriveId, 
       Path = path + "/" + filename 
      } 
     }; 

     var freq = _client 
       .Me 
       .Drive 
       .Items[parent.Id] 
       .Children 
       .Request(); 

     // add the drive item 
     file = await freq.AddAsync(file); 

     DriveItem uploadedFile = null; 
     using (MemoryStream stream = new MemoryStream(data)) 
     { 
      var req = _client 
       .Me 
       .ItemWithPath(path + "/" + file.Name) 
       .Content 
       .Request(); 

      stream.Position = 0; 
      // upload the content to the driveitem just created 
      try 
      { 
       uploadedFile = await req.PutAsync<DriveItem>(stream); 
      } 
      catch(Exception ex) 
      { 
       Debug.WriteLine("File Put Error"); <<< FAILS HERE 
      } 
     } 

     return uploadedFile; 

Eine Ausnahme von der req.PutAsync Methode ausgelöst wird, um den Byte-Array, das den Inhalt der Datei zu laden. Ich teste gerade mit einer einfachen Textdatei, die weniger als 100 Bytes groß ist. Die Ausnahme enthält die fehlerhafte Anforderung und den nicht unterstützten Segmenttyp.

Die Datei wird in OneDrive erstellt, enthält jedoch 0 Byte.

Antwort

2

Me.ItemWithPath() benötigt den vollständigen Pfad nach/me. Beispiel: _client.Me.ItemWithPath ("/ drives/driveId/items/itemId:/file/path"). Diese Methode ist so, dass der zurückgegebene Path für die ItemReference, die über die API zurückgegeben wird, ohne jegliche Verarbeitung an die ItemWithPath-Methode übergeben werden kann.

Was Sie verwenden möchten ist:

var req = _client 
      .Me 
      .Drive 
      .ItemWithPath(path + "/" + file.Name) 
      .Content 
      .Request(); 

oder:

var req = _client 
      .Me 
      .ItemWithPath(file.ParentReference.Path + "/" + file.Name) 
      .Content 
      .Request(); 
1

ich gefunden habe, dass es manchmal einfacher ist, den Weg in Lee überspringen von den übergeordneten Ordner-ID-Einstellung in die SDK-Anweisung ... funktioniert in OneDrive und Unified Groups.

var createdFile = await graphClient.Me.Drive 
         .Items[currentDriveFolder.id] 
         .ItemWithPath(fileName) 
         .Content.Request() 
         .PutAsync<DriveItem>(stream); 

Ich würde wirklich gerne abl sein e, um Laufwerks-ID und Ordner-ID so zu setzen:

var createdFile = await graphClient 
         .Drives[driveId] 
         .Items[folderId] 
         .ItemWithPath(fileName) 
         .Content 
         .Request() 
         .PutAsync<DriveItem>(stream); 
+0

Dies funktionierte perfekt, und es hatte auch den Vorteil, die Datei zu erstellen und den Inhalt in einem einzigen Schritt hochzuladen – Sergio0694

Verwandte Themen