Я хочу загрузить файл в определенную папку с помощью Google Drive API curl

Я загрузил файл на Google Диск с помощью curl API. Но я хочу загрузить файл в определенную папку. Я также пробовал использовать идентификатор папки в URL-адресе API, например: 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, но все еще не получил файл в папке. Таким образом решена проблема с моим файлом без названия.


person P.patel    schedule 05.03.2019    source источник
comment
Не работал с этим URL: googleapis.com/upload/ диск / v3 / files / folder_id? uploadType = media   -  person P.patel    schedule 05.03.2019
comment
пожалуйста, включите код, который вы используете для создания   -  person DaImTo    schedule 05.03.2019


Ответы (1)


Загрузка файлов на Google Диск состоит из двух частей. (обратите внимание, что это можно сделать как один вызов, но если вы хотите добавить данные corect, лучше всего сделать это как два)

create Добавляет исходные метаданные для файла. Имя, тип носителя и расположение, являющееся его родительским каталогом.

Во-вторых, фактическая загрузка самого файла.

Примечание: файл, загруженный без предварительной отправки метаданных, чаще всего создает фиктивные метаданные с названием файла «неизвестно».

Создать

Когда вы выполняете создание инерциальных метаданных. Вам нужно добавить родителей в этот начальный вызов, поле называется parents[], вам нужно добавить туда идентификатор файла. Я не могу вам помочь, потому что вы не добавляете для этого код.

Загрузить

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

Если вы проверите документацию, вы найдете дополнительные параметры запроса

введите здесь описание изображения

Попробуйте использовать &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); 
person DaImTo    schedule 05.03.2019
comment
Куда я могу добавить? В URL-адресе API? - person P.patel; 05.03.2019
comment
Как это googleapdrive.com/upload v3 / - person P.patel; 05.03.2019
comment
Удалите []. Вы должны были создать файл с родителем. Я не уверен, что загрузка файла в другой файл, в котором изначально были созданы метаданные, будет работать. Вероятно, он создаст вам фиктивные метаданные для новой загрузки в каталоге. - person DaImTo; 05.03.2019
comment
Есть ли способ сделать с завитком? - person P.patel; 05.03.2019
comment
Да, конечно, создайте с родителем, а затем загрузите файл в созданные метаданные. - person DaImTo; 05.03.2019
comment
На самом деле я не знаю, куда вводить метаданные в запросе curl. Вы можете изменить мой код? - person P.patel; 05.03.2019
comment
Вы сказали, что вызываете метод create, опубликуйте этот код, как я уже просил. - person DaImTo; 05.03.2019
comment
Я добавил код. Это мой последний код. Я создал папку вручную на Google Диске. Не по коду - person P.patel; 05.03.2019
comment
Мне нужен код, в котором вы вызываете developers.google.com/drive / api / v3 / reference / files / create Это в том, что вам нужно добавить родительский идентификатор. - person DaImTo; 05.03.2019
comment
Не использовать этот тип URL только с помощью googleapis.com/upload/drive/ v3 / files? uploadType = media, чтобы загрузить файл. - person P.patel; 05.03.2019
comment
Можете ли вы проверить мой код? Я отредактировал его и добавил туда идентификатор папки - person P.patel; 06.03.2019
comment
Тело сообщения - json. Вам нужно создать объект для публикации, а затем json_encode его - person DaImTo; 06.03.2019
comment
Все еще вне папки. Не знаю что делаю не так - person P.patel; 06.03.2019
comment
googleapis.com/drive/v3/files ». $ file_id. '? addParents = folder_id & removeParents = root Это работает для меня (не включать загрузку в API запросов) - person P.patel; 09.03.2019