Я хочу загрузить файл в определенную папку с помощью Google Drive API Curl - PullRequest
0 голосов
/ 05 марта 2019

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

1 Ответ

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

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

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

Вторая фактическая загрузка самого файла.

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

Создать

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

Загрузить

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

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

enter image description here

Попробуйте использовать &addParents=[folderId]

* +1039 * Пример:
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); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...