【问题标题】:I want to upload file to specific folder with google drive API curl我想使用 google drive API curl 将文件上传到特定文件夹
【发布时间】:2019-07-26 18:07:49
【问题描述】:

我已使用 curl API 将文件上传到谷歌驱动器。但我想将文件上传到特定文件夹。我也尝试过使用 API url 中的文件夹 ID,例如:https://www.googleapis.com/upload/drive/v3/files/folder_id?uploadType=media

add_action('wpcf7_before_send_mail', 'save_application_form');

function save_application_form($WPCF7_ContactForm) {

    $wpcf7 = WPCF7_ContactForm :: get_current();
    $submission = WPCF7_Submission :: get_instance();
    if ($WPCF7_ContactForm->id == 8578) {
        if ($submission) {
            $submited = array();
            //$submited['title'] = $wpcf7->title();
            $submited['posted_data'] = $submission->get_posted_data();
            $uploaded_files = $submission->uploaded_files();
            $name = $submited['posted_data']["Name"];
            $position_test = $submited['posted_data']["Position"];
            $email = $submited['posted_data']["Email"];
            $phone = $submited['posted_data']["phone"];
            $message = $submited['posted_data']["Message"];
            $position = $submited['posted_data']["AttachYourCV"];

           // $test2 = $_FILES['AttachYourCV']['name'];

            $finfo = finfo_open(FILEINFO_MIME_TYPE);
            $cf7_file_field_name = 'AttachYourCV';

            $image_location = $uploaded_files[$cf7_file_field_name];
            $mime_type = finfo_file($finfo, $image_location);
            $token = GetRefreshedAccessToken('client_id', 'refresh_token', 'client_secret');
            $ch = curl_init();
            curl_setopt_array($ch, array(
                CURLOPT_URL => 'https://www.googleapis.com/upload/drive/v3/files?uploadType=media',
                CURLOPT_HTTPHEADER => array(
                    'Content-Type:' . $mime_type, // todo: runtime detection?
                    'Authorization: Bearer ' . $token
                ),
                CURLOPT_POST => 1,
                CURLOPT_POSTFIELDS => file_get_contents($image_location),
                CURLOPT_RETURNTRANSFER => 1
            ));
            $response = curl_exec($ch);
            $id = json_decode($response, TRUE);
            $get_id = $id['id'];

    curl_close($ch);
   if (isset($id['id'])) {
            $get_id = $id['id'];
            $post_fields = array();
            $folder_id = '1-9r8oVsAfV_iJmYh1cZYPMvE9Qhv8RLA';
            // remove extension  
            $this_file_name = explode('.', $position);

            // submit name field  
            $post_fields['name'] .= $this_file_name[0];
            $post_fields['parents'] = $folder_id[1];
            $ch2 = curl_init();
            curl_setopt_array($ch2, array(
                CURLOPT_URL => 'https://www.googleapis.com/drive/v3/files/' . $get_id,
                CURLOPT_HTTPHEADER => array(
                    'Content-Type:application/json', // todo: runtime detection?
                    'Authorization: Bearer ' . $token
                ),
                CURLOPT_POST => 1,
                CURLOPT_CUSTOMREQUEST => 'PATCH',
                CURLOPT_POSTFIELDS => json_encode($post_fields),
                CURLOPT_RETURNTRANSFER => 1
            ));
            $response = curl_exec($ch2);
            if ($response === false) {
                $output = 'ERROR: ' . curl_error($ch2);
            } else {
                $output = $response;
            }

            // close second request handler  
            curl_close($ch2);


        }
}

我添加了另一个 curl 调用,但仍然没有在文件夹中获取文件。我的文件无标题问题通过这种方式解决了。

【问题讨论】:

标签: php wordpress google-drive-api php-curl google-drive-shared-drive


【解决方案1】:

将文件上传到谷歌驱动器是一个两部分的事情。 (请注意,它可以作为单个调用完成,但如果您想添加 corect 数据,最好将其作为两个)

create 为文件添加初始元数据。作为其父目录的名称、媒体类型和位置。

第二次实际上传文件本身。

注意:在没有先发送元数据的情况下上传的文件将创建一个虚拟元数据,该文件的标题通常为“未知”。

创建

当您执行 create 的惯性元数据时。您需要在此初始调用中添加父母,该字段名为 parents[] 您需要在此处添加文件 ID。我无法帮助您这样做,因为您没有为其添加代码。

上传

默认情况下,文件会上传到根文件夹,除非您为文件添加父文件夹 ID。

如果您检查documentation,您会发现可选的查询参数

尝试使用&addParents=[folderId]

例子:

https://www.googleapis.com/upload/drive/v3/files?uploadType=media&addParents=1bpHmln41UI-CRe5idKvxrkIpGKh57T32

如果您最初在根目录中为文件创建了元数据,然后尝试将文件上传到不同的目录,我怀疑上传会创建新的元数据。这两个调用需要做同样的事情。您的创建应该设置父母。

帖子正文

$data = array("name" => "test.jpg", "parents" => array("123456"));                                                                    
$data_string = json_encode($data);                                                                                   

curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); 

【讨论】:

  • 我可以在哪里添加?在 API 网址中?
  • 删除 []'s 你应该已经用父文件创建了文件。我不确定直接将文件上传到不同的文件然后最初创建元数据是否会起作用。它可能会为目录中的新上传创建一些虚拟元数据。
  • curl有什么办法吗?
  • googleapis.com/drive/v3/files' 。 $file_id 。 '?addParents=folder_id&removeParents=root 它对我有用(不包括在请求 API 中上传)
猜你喜欢
  • 1970-01-01
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多