如何使用php-curl将文件以“多部分”类型上传到GoogleDrive?

问题描述 投票:0回答:1

我想使用除google-api-php-client以外的其他PHP curl上传,但是我真的不知道如何做到,这里是文档:Send a multipart upload request

这是我的代码段,我被卡在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; charset = UTF-8。将文件的元数据以JSON格式添加到此部分。
  • 媒体部分。必须排第二,并且必须具有Content-Type标头,该标头可以具有任何MIME类型。将文件数据添加到此部分。
php google-drive-api php-curl boundary
1个回答
0
投票
  • 您想通过Drive API v3使用multipart/ralated上传文件。
  • 您想使用PHP CURL实现。
  • 您的访问令牌可用于将文件上传到Google云端硬盘。

如果我的理解正确,那么这个答案如何?请认为这只是几个可能的答案之一。

修改点:

  • 在这种情况下,我建议创建一个包含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 MB的文件。请注意这一点。

参考:

  • Perform a multipart upload

    分段上传:uploadType = multipart。为了快速传输一个小文件(小于等于5 MB)和描述该文件的元数据,所有这些都可在单个请求中完成。

如果我误解了你的问题,而这不是你想要的方向,我深表歉意。

© www.soinside.com 2019 - 2024. All rights reserved.