Как я могу загрузить файлы в GoogleDrive в «многочастном» виде с помощью php -curl? - PullRequest
1 голос
/ 23 марта 2020

Я хочу загрузить, используя php curl, отличный от google-api- php -client , но я действительно не знаю, как это сделать, вот документация: Отправить запрос на загрузку нескольких частей

Вот мой фрагмент кода, я застрял в CURLOPT_POSTFIELDS, кто-нибудь может мне помочь с этим?

public function uploadByCurl($uploadFilePath, $accessToken){
    $ch = curl_init();
    $mimeType = $this->getMimeType($uploadFilePath);
    $options = [
        CURLOPT_URL =>  'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart',
        CURLOPT_POST => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POSTFIELDS => [
            'file' => new \CURLFile($uploadFilePath),
            // 'name' =>
        ],
        CURLOPT_HTTPHEADER => [
            'Authorization:Bearer ' . $accessToken,
            'Content-Type:' . $mimeType,
            'Content-Length:' . filesize($uploadFilePath),
        ],
        //In case you're in Windows, sometimes will throw error if not set SSL verification to false
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => 0,
    ];
    //In case you need a proxy
    //$options[CURLOPT_PROXY] = 'http://127.0.0.1:1087';

    curl_setopt_array($ch, $options);
    $result = curl_exec($ch);
    if (curl_errno($ch)) {
        echo 'Error:' . curl_error($ch);
    }
    curl_close ($ch);
    return $result;
}

Я просто не знаю как перевести это в код (не знакомый с multipart/related):

  • Часть метаданных. Должен быть первым и должен иметь заголовок Content-Type, установленный на application / json; кодировка = UTF-8. Добавьте метаданные файла к этой части в формате JSON.
  • Медиа часть. Должен быть вторым и должен иметь заголовок Content-Type, который может иметь любой тип MIME. Добавьте данные файла в эту часть.

1 Ответ

2 голосов
/ 24 марта 2020
  • Вы хотите загрузить файл с помощью multipart/ralated с Drive API v3.
  • Вы хотите добиться этого с помощью PHP CURL.
  • Можно использовать свой токен доступа для загрузки файла на Google Drive.

Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Точки модификации:

  • В этом случае я хотел бы предложить создать структуру, включающую файл и метаданные для multipart/ralated и запросите его.

Модифицированный скрипт:

Когда ваш скрипт модифицируется, он выглядит следующим образом.

public function uploadByCurl($uploadFilePath, $accessToken){
    $handle = fopen($uploadFilePath, "rb");
    $file = fread($handle, filesize($uploadFilePath));
    fclose($handle);

    $boundary = "xxxxxxxxxx";
    $data = "--" . $boundary . "\r\n";
    $data .= "Content-Type: application/json; charset=UTF-8\r\n\r\n";
    $data .= "{\"name\": \"" . basename($uploadFilePath) . "\", \"mimeType\": \"" . mime_content_type($uploadFilePath) . "\"}\r\n";
    $data .= "--" . $boundary . "\r\n";
    $data .= "Content-Transfer-Encoding: base64\r\n\r\n";
    $data .= base64_encode($file);
    $data .= "\r\n--" . $boundary . "--";

    $ch = curl_init();
    $options = [
        CURLOPT_URL =>  'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart',
        CURLOPT_POST => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POSTFIELDS => $data,
        CURLOPT_HTTPHEADER => [
            'Authorization:Bearer ' . $accessToken,
            'Content-Type:multipart/related; boundary=' . $boundary,
        ],
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => 0,
    ];
    curl_setopt_array($ch, $options);
    $result = curl_exec($ch);
    if (curl_errno($ch)) {
        echo 'Error:' . curl_error($ch);
    }
    curl_close ($ch);
    return $result;
}
  • При этом В измененном сценарии имя файла и mimeType извлекаются из $uploadFilePath.

Примечание:

  • Многоэтапная загрузка может загружать файлы размером менее 5 МБ. Пожалуйста, будьте осторожны с этим.

Ссылки:

  • Выполните многоэтапную загрузку

    Составную загрузку: uploadType = многочастному. Для быстрой передачи небольшого файла (5 МБ или менее) и метаданных, которые описывают файл, все в одном запросе.

Если я неправильно понял ваш вопрос, и это не было направление, которое вы хотите, я прошу прощения.

...