2016-12-01 6 views
1

Я пытаюсь загрузить файл изображения (размер 12 КБ) в учетную запись администратора onedrive для бизнеса с использованием веб-API. Я могу получить диск, корень и childrenItems без ошибок.Загрузка файла в onedrive для бизнеса с использованием графа Microsoft

var drive = FilesHelper.GetUserPersonalDrive(); 
var root = FilesHelper.GetUserPersonalDriveRoot(); 
var childrenItems = FilesHelper.ListFolderChildren(drive.Id, root.Id); 

, но когда я пытаюсь загрузить файл изображения:

var new FileOnRoot= UploadSampleFile(drive,root,Server.MapPath("~/drive.png")); 

это бросить исключение:

{ 
    "error": { 
    "code": "unauthenticated", 
    "message": "The caller is not authenticated.", 
    "innerError": { 
     "request-id": "1bd87259-4eef-4c36-8356-2f8fcc274608", 
     "date": "2016-12-01T10:35:50" 
    } 
    } 
} 

Я позволяю почти все разрешения на чтение под делегированных разрешений для Graph API и все разрешения приложений.

private DriveItem UploadSampleFile(Drive drive, DriveItem newFolder, String filePath) 
    { 
     DriveItem result = null; 
     Stream memPhoto = getFileContent(filePath); 

     try 
     { 
      if (memPhoto.Length > 0) 
      { 
       String contentType = "image/png"; 
       result = FilesHelper.UploadFileDirect(drive.Id, newFolder.Id, 
        new DriveItem 
        { 
         File = new File { }, 
         Name = filePath.Substring(filePath.LastIndexOf("\\") + 1), 
         ConflictBehavior = "rename", 
        }, 
        memPhoto, 
        contentType); 
      } 
     } 
     catch (Exception ex) 
     { 
    } 

FilesHelper класс

public static class FilesHelper 
{ 
    public static Drive GetUserPersonalDrive() 
    { 
     String jsonResponse = MicrosoftGraphHelper.MakeGetRequestForString(
      String.Format("{0}me/drive", 
       MicrosoftGraphHelper.MicrosoftGraphV1BaseUri)); 

     var drive = JsonConvert.DeserializeObject<Drive>(jsonResponse); 
     return (drive); 
    } 

    public static DriveItem GetUserPersonalDriveRoot() 
    { 
     String jsonResponse = MicrosoftGraphHelper.MakeGetRequestForString(
      String.Format("{0}me/drive/root", 
       MicrosoftGraphHelper.MicrosoftGraphV1BaseUri)); 

     var folder = JsonConvert.DeserializeObject<DriveItem>(jsonResponse); 
     return (folder); 
    } 

    public static List<DriveItem> ListFolderChildren(String driveId, String folderId, Int32 numberOfItems = 100) 
    { 
     String jsonResponse = MicrosoftGraphHelper.MakeGetRequestForString(
      String.Format("{0}drives/{1}/items/{2}/children?$top={3}", 
       MicrosoftGraphHelper.MicrosoftGraphV1BaseUri, 
       driveId, 
       folderId, 
       numberOfItems)); 

     var driveItems = JsonConvert.DeserializeObject<DriveItemList>(jsonResponse); 
     return (driveItems.DriveItems); 
    } 


    public static Stream GetFileContent(String driveId, String fileId, String contentType) 
    { 
     Stream fileContent = MicrosoftGraphHelper.MakeGetRequestForStream(
      String.Format("{0}drives/{1}/items/{2}/content", 
       MicrosoftGraphHelper.MicrosoftGraphV1BaseUri, 
       driveId, 
       fileId), 
       contentType); 

     return (fileContent); 
    } 

    public static DriveItem UploadFileDirect(String driveId, String parentFolderId, 
     DriveItem file, Stream content, String contentType) 
    { 
     var jsonResponse = MicrosoftGraphHelper.MakePutRequestForString(
      String.Format("{0}drives/{1}/items/{2}/children/{3}/content", 
       MicrosoftGraphHelper.MicrosoftGraphV1BaseUri, 
       driveId, 
       parentFolderId, 
       file.Name), 
       content, 
       contentType); 

     var uploadedFile = JsonConvert.DeserializeObject<DriveItem>(jsonResponse); 

     return (uploadedFile); 
    } 
} 

MicrosoftGraphHelper класс

public static class FilesHelper 
{ 
    public static Drive GetUserPersonalDrive() 
    { 
     String jsonResponse = MicrosoftGraphHelper.MakeGetRequestForString(
      String.Format("{0}me/drive", 
       MicrosoftGraphHelper.MicrosoftGraphV1BaseUri)); 

     var drive = JsonConvert.DeserializeObject<Drive>(jsonResponse); 
     return (drive); 
    } 

    public static DriveItem GetUserPersonalDriveRoot() 
    { 
     String jsonResponse = MicrosoftGraphHelper.MakeGetRequestForString(
      String.Format("{0}me/drive/root", 
       MicrosoftGraphHelper.MicrosoftGraphV1BaseUri)); 

     var folder = JsonConvert.DeserializeObject<DriveItem>(jsonResponse); 
     return (folder); 
    } 

    public static List<DriveItem> ListFolderChildren(String driveId, String folderId, Int32 numberOfItems = 100) 
    { 
     String jsonResponse = MicrosoftGraphHelper.MakeGetRequestForString(
      String.Format("{0}drives/{1}/items/{2}/children?$top={3}", 
       MicrosoftGraphHelper.MicrosoftGraphV1BaseUri, 
       driveId, 
       folderId, 
       numberOfItems)); 

     var driveItems = JsonConvert.DeserializeObject<DriveItemList>(jsonResponse); 
     return (driveItems.DriveItems); 
    } 


    public static Stream GetFileContent(String driveId, String fileId, String contentType) 
    { 
     Stream fileContent = MicrosoftGraphHelper.MakeGetRequestForStream(
      String.Format("{0}drives/{1}/items/{2}/content", 
       MicrosoftGraphHelper.MicrosoftGraphV1BaseUri, 
       driveId, 
       fileId), 
       contentType); 

     return (fileContent); 
    } 

    public static DriveItem UploadFileDirect(String driveId, String parentFolderId, 
     DriveItem file, Stream content, String contentType) 
    { 
     var jsonResponse = MicrosoftGraphHelper.MakePutRequestForString(
      String.Format("{0}drives/{1}/items/{2}/children/{3}/content", 
       MicrosoftGraphHelper.MicrosoftGraphV1BaseUri, 
       driveId, 
       parentFolderId, 
       file.Name), 
       content, 
       contentType); 

     var uploadedFile = JsonConvert.DeserializeObject<DriveItem>(jsonResponse); 

     return (uploadedFile); 
    } 
} 

ответ

0

Вы говорите, что вы позволяете ALL чтения разрешения. Однако для загрузки файла в OneDrive требуется разрешение . Убедитесь, что вы выбрали делегированное разрешение Files.ReadWrite (при условии, что вы используете делегированные потоки). Кроме того, при выборе разрешений убедитесь, что вы применяете наименее привилегированный подход. Если вы используете делегированные потоки, не выбирайте разрешения для приложений и наоборот. Вы должны следовать указаниям here.

Также у нас есть серия доступных образцов, которые могут помочь вам в вызове REST или вызове через клиентскую библиотеку Microsoft Graph .Net, например, sample, которая также имеет код для загрузки файлов. Вы можете найти наши SDK и образцы на GitHub here.

Надеюсь, что это поможет,

Смежные вопросы