Загрузка файла API-интерфейса Microsoft Graph с использованием PHP SDK для большого файла все еще не удается - PullRequest
0 голосов
/ 15 ноября 2018

Я сейчас использую microsoft-php-sdk , и это было довольно хорошо. Мне удалось загрузить небольшие файлы с сервера в OneDrive. Но когда я попытался загрузить 38-мегабайтный файл Powerpoint, он не удался. Документация Microsoft Graph API предлагает создать сеанс загрузки. Я думал, что это будет так же просто, как просто обновить URI с / content до / createUploadSession , но все равно не получалось.

$response = $graph->createRequest('POST', '/me/drive/root/children/'.basename($path).'/createUploadSession')
      ->setReturnType(Model\DriveItem::class)
      ->upload($path);

Мой код выглядит примерно так. У меня возникли трудности с поиском документации по PHP SDK, и не было примера для загрузки. Кто-нибудь использовал PHP SDK для этого сценария раньше?

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019
<?php
require __DIR__.'/path/to/vendor/autoload.php';

use Microsoft\Graph\Graph;
use Microsoft\Graph\Model;

$graph = new Graph();
$graph->setAccessToken('YOUR_TOKEN_HERE');

/** @var Model\UploadSession $uploadSession */
$uploadSession = $graph->createRequest("POST", "/me/drive/items/root:/doc-test2.docx:/createUploadSession")
    ->addHeaders(["Content-Type" => "application/json"])
    ->attachBody([
        "item" => [
            "@microsoft.graph.conflictBehavior" => "rename",
            "description"    => 'File description here'
        ]
    ])
    ->setReturnType(Model\UploadSession::class)
    ->execute();

$file = __DIR__.'/path/to/large-file.avi';
$handle = fopen($file, 'r');
$fileSize = fileSize($file);
$fileNbByte = $fileSize - 1;
$chunkSize = 1024*1024*4;
$fgetsLength = $chunkSize + 1;
$start = 0;
while (!feof($handle)) {
    $bytes = fread($handle, $fgetsLength);
    $end = $chunkSize + $start;
    if ($end > $fileNbByte) {
        $end = $fileNbByte;
    }
    $stream = \GuzzleHttp\Psr7\stream_for($bytes);
    $res = $graph->createRequest("PUT", $uploadSession->getUploadUrl())
        ->addHeaders([
            'Content-Length' => ($end - 1) - $start,
            'Content-Range' => "bytes " . $start . "-" . $end . "/" . $fileSize
        ])
        ->setReturnType(Model\UploadSession::class)
        ->attachBody($bytes)
        ->execute();

    $start = $end + 1;
}

Это работа для меня!

0 голосов
/ 20 марта 2019

Я разработал аналогичную библиотеку для oneDrive на основе Microsoft API Graph Rest API. Эта проблема также решается здесь: tarask / oneDrive

посмотрите документацию в разделе Загрузка больших файлов

0 голосов
/ 26 ноября 2018

Я не знаком с PHP, но я знаком с API загрузки.Надеюсь, это поможет.

Конечная точка /content, которую вы использовали ранее, позволяет напрямую записывать двоичное содержимое в файл и возвращает DriveItem, как того требует ваш код.Метод /createUploadSession работает по-другому.В документации Graph для возобновляемой загрузки это подробно описано, но я здесь подведу итоги.

  1. Вместо отправки двоичного содержимого в запросе CreateUploadSession вы либо отправляете пустое тело, либо выотправьте полезную нагрузку JSON с метаданными, такими как имя файла или поведение разрешения конфликта.
  2. Ответ от CreateUploadSession - это объект UploadSession, а не DriveItem.У объекта есть свойство uploadUrl, которое используется для отправки двоичных данных.
  3. Загружайте двоичные данные по нескольким запросам, используя заголовок HTTP Content-Range, чтобы указать, какой диапазон байтов вы загружаете.
  4. Как только сервер получает последние байты файла, загрузка автоматически завершается.

Хотя этот обзор иллюстрирует основы, есть еще несколько концепций, которые вам следует кодировать.Например, если один из ваших диапазонов байтов не загружается, вам нужно спросить сервер, какие байтовые диапазоны у него уже есть и где возобновить.Это и другие вещи подробно описаны в документах.https://developer.microsoft.com/en-us/graph/docs/api-reference/v1.0/api/driveitem_createuploadsession

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...