質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

Q&A

解決済

1回答

984閲覧

Youtubeへ動画をアップロードする処理の部分でエラーが発生してしまった

study_111

総合スコア82

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

0グッド

0クリップ

投稿2020/07/06 09:34

編集2020/07/06 10:23

前提・実現したいこと

YoutubeDataApiV3を使用し、youtubeの動画アップロードを行いたいと考えています。

発生している問題・エラーメッセージ

公式ページのサンプルコードをエディターに貼り付けてみたのですが、一点のみエラーが発生してしまいました。(動画のタイトルやタグの設定部分などは変数に置き換えるなどの変更をしました)

エラーは発生しているのは、以下の$insertRequestの部分になります。

$media = new Google_Http_MediaFileUpload( $client, $insertRequest, 'video/*', null, true, $chunkSizeBytes ); $media->setFileSize(filesize($videoPath));

エラーの内容は以下の画像になります。
イメージ説明

該当のソースコード

以下は、upload.phpになります。

php

1<?php 2require_once __DIR__ . '/vendor/autoload.php'; 3session_start(); 4 5if ($_SERVER['REQUEST_METHOD'] == 'GET') { 6 echo('getリクエストです'); 7 exit(); 8} 9 10$err_msg = array(); 11$title = ''; 12$description = ''; 13$tag = ''; 14$tag_array = array(); 15$category_id = ''; 16 17// $tag_array[0] = 'aaa'; 18// var_dump($tag_array); 19//拡張子取得 20function getExt($filename) 21{ 22 return pathinfo($filename, PATHINFO_EXTENSION); 23} 24// echo(__DIR__ ); 25 26 27 28//タイトル取得 29if(isset($_POST['title'])){ 30 $title = $_POST['title']; 31 // print($comment); 32} 33 34//説明 35if(isset($_POST['description'])){ 36 $description = $_POST['description']; 37 // print($comment); 38} 39 40echo('tag'); 41 42//タグ 43if(isset($_POST['tag'])){ 44 // echo('sss'); 45 $tag = $_POST['tag']; 46 echo($tag); 47 if (mb_strlen($tag, 'UTF-8') > 500){ 48 $err_msg[] = 'タグに登録出来る文字数は500文字以内です'; 49 }else{ 50 $tag_array = explode(',',$tag); 51 // $tag_array = array_filter($tag_array,'strlen'); 52 $tag_array = array_filter($tag_array,function($x){ 53 return preg_match("/\S+/misu",$x); 54 }); 55 56 // var_dump($tag_array[3]); 57 $tag_array = array_unique($tag_array); 58 var_dump($tag_array); 59 } 60} 61 62if(isset($_POST['category'])){ 63 $category_id = $_POST['category']; 64 // var_dump($category_id); 65} 66 67 68if(isset($_FILES['certification_file']['tmp_name'])){ 69 // echo('jsonファイルは存在します'); 70 // echo($_FILES['certification_file']['tmp_name']); 71 $ext = getExt($_FILES['certification_file']['name']); 72 // echo(__LINE__); 73 echo($ext); 74 75 if ($ext == "json"){ 76 // echo("jsonファイルです。"); 77 $certification_tmpfile = $_FILES['certification_file']['tmp_name']; 78 $certification_filename = "./credentials/" . date("YmdHis"); 79 $certification_filename .= mt_rand(); 80 // $certification_filename = "./credentials/". $_FILES['certification_file']['name']; 81 $certification_filename .= '.' . $ext; 82 if (is_uploaded_file($certification_tmpfile)) { 83 84 if ( move_uploaded_file($certification_tmpfile , $certification_filename)) { 85 echo $certification_filename . "をアップロードしました。"; 86 } else { 87 echo "ファイルをアップロードできません。"; 88 } 89 90 } else { 91 echo "ファイルが選択されていません。"; 92 } 93 }else{ 94 echo("credentials.jsonファイルではありません。"); 95 } 96 97 // echo($_FILES['certification_file']['type']); 98 // echo($certification_filename); 99 // echo "\n"; 100 101 // echo($certification_tmpfile); 102} 103 104if(isset($_FILES['movie_file']['tmp_name'])){ 105 106 $ext = getExt($_FILES['movie_file']['name']); 107 108 $movie_tmpfile = $_FILES['movie_file']['tmp_name']; 109 110 $movie_filename = "./movies/" . date("YmdHis"); 111 $movie_filename .= "." . $ext; 112 113 if (is_uploaded_file($movie_tmpfile)) { 114 115 if ( move_uploaded_file($movie_tmpfile , $movie_filename)) { 116 echo $movie_filename . "をアップロードしました。"; 117 } else { 118 echo "ファイルをアップロードできません。"; 119 } 120 } else { 121 echo "ファイルが選択されていません。"; 122 } 123 124 // echo($movie_tmpfile); 125} 126 127// echo($movie_filename)."\n"; 128 129 130 131$url = $certification_filename; 132$json = file_get_contents($url); 133$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN'); 134// echo($json); 135$cert_arr = json_decode($json,true); 136// var_dump($cert_arr); 137 138 139if (!file_exists(__DIR__ . '/vendor/autoload.php')) { 140 throw new \Exception('please run "composer require google/apiclient:~2.0" in "' . __DIR__ .'"'); 141} 142 143$OAUTH2_CLIENT_ID = $cert_arr['web']['client_id']; 144$OAUTH2_CLIENT_SECRET = $cert_arr['web']['client_secret']; 145// echo($OAUTH2_CLIENT_ID); 146echo '<br>'; 147// echo($OAUTH2_CLIENT_SECRET); 148echo($_SERVER['HTTP_HOST'] ); 149$client = new Google_Client(); 150$client->setClientId($OAUTH2_CLIENT_ID); 151$client->setClientSecret($OAUTH2_CLIENT_SECRET); 152$client->setScopes('https://www.googleapis.com/auth/youtube'); 153$redirect = filter_var('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'], 154 FILTER_SANITIZE_URL); 155$client->setRedirectUri($redirect); 156 157// 使用するサービスを作成 158$youtube = new Google_Service_YouTube($client); 159 160// var_dump($youtube); 161$tokenSessionKey = 'token-' . $client->prepareScopes(); 162if (isset($_GET['code'])) { 163 if (strval($_SESSION['state']) !== strval($_GET['state'])) { 164 die('The session state did not match.'); 165 } 166 $client->authenticate($_GET['code']); 167 $_SESSION[$tokenSessionKey] = $client->getAccessToken(); 168 header('Location: ' . $redirect); 169} 170if (isset($_SESSION[$tokenSessionKey])) { 171 $client->setAccessToken($_SESSION[$tokenSessionKey]); 172} 173 174 175// Check to ensure that the access token was successfully acquired. 176if ($client->getAccessToken()) { 177 $htmlBody = ''; 178 try{ 179 180 //アップロードするファイルパスへ置き換える 181 $videoPath = $movie_filename; 182 183 // Create a snippet with title, description, tags and category ID 184 // Create an asset resource and set its snippet metadata and type. 185 // This example sets the video's title, description, keyword tags, and 186 // video category. 187 188 $snippet = new Google_Service_YouTube_VideoSnippet(); 189 $snippet->setTitle($title); 190 $snippet->setDescription($description); 191 $snippet->setTags($tag_array); 192 193 // Numeric video category. See 194 // https://developers.google.com/youtube/v3/docs/videoCategories/list 195 $snippet->setCategoryId($category_id); 196 197 // Set the video's status to "public". Valid statuses are "public", 198 // "private" and "unlisted". 199 $status = new Google_Service_YouTube_VideoStatus(); 200 201 //公開ステータスは「非公開」に設定 202 $status->privacyStatus = "private"; 203 204 // Associate the snippet and status objects with a new video resource. 205 $video = new Google_Service_YouTube_Video(); 206 $video->setSnippet($snippet); 207 $video->setStatus($status); 208 209 // Specify the size of each chunk of data, in bytes. Set a higher value for 210 // reliable connection as fewer chunks lead to faster uploads. Set a lower 211 // value for better recovery on less reliable connections. 212 $chunkSizeBytes = 1 * 1024 * 1024; 213 214 // Setting the defer flag to true tells the client to return a request which can be called 215 // with ->execute(); instead of making the API call immediately. 216 $client->setDefer(true); 217 218 // Create a request for the API's videos.insert method to create and upload the video. 219 $insertRequest = $youtube->videos->insert("status,snippet", $video); 220 221 // Create a MediaFileUpload object for resumable uploads. 222 $media = new Google_Http_MediaFileUpload( 223 $client, 224 $insertRequest, 225 'video/*', 226 null, 227 true, 228 $chunkSizeBytes 229 ); 230 $media->setFileSize(filesize($videoPath)); 231 232 233 // Read the media file and upload it chunk by chunk. 234 $status = false; 235 $handle = fopen($videoPath, "rb"); 236 while (!$status && !feof($handle)) { 237 $chunk = fread($handle, $chunkSizeBytes); 238 $status = $media->nextChunk($chunk); 239 } 240 241 fclose($handle); 242 243 // If you want to make other calls after the file upload, set setDefer back to false 244 $client->setDefer(false); 245 246 247 $htmlBody .= "<h3>Video Uploaded</h3><ul>"; 248 $htmlBody .= sprintf('<li>%s (%s)</li>', 249 $status['snippet']['title'], 250 $status['id']); 251 252 $htmlBody .= '</ul>'; 253 254 } catch (Google_Service_Exception $e) { 255 $htmlBody .= sprintf('<p>A service error occurred: <code>%s</code></p>', 256 htmlspecialchars($e->getMessage())); 257 } catch (Google_Exception $e) { 258 $htmlBody .= sprintf('<p>An client error occurred: <code>%s</code></p>', 259 htmlspecialchars($e->getMessage())); 260 } 261 262 $_SESSION[$tokenSessionKey] = $client->getAccessToken(); 263 } elseif ($OAUTH2_CLIENT_ID == 'REPLACE_ME') { 264 $htmlBody = <<<END 265 <h3>Client Credentials Required</h3> 266 <p> 267 You need to set <code>$OAUTH2_CLIENT_ID</code> and 268 <code>$OAUTH2_CLIENT_ID</code> before proceeding. 269 <p> 270 END; 271 } else { 272 // If the user hasn't authorized the app, initiate the OAuth flow 273 $state = mt_rand(); 274 $client->setState($state); 275 $_SESSION['state'] = $state; 276 277 $authUrl = $client->createAuthUrl(); 278 $htmlBody = <<<END 279 <h3>Authorization Required</h3> 280 <p>You need to <a href="$authUrl">authorize access</a> before proceeding.<p> 281 END; 282 } 283 ?> 284<!-- // // // $url = __DIR__ . ; -->

試したこと

エラー内容をインターネットで検索するも、改善に至る記事が見当たらない状況です。

追記

htmlファイルのformから値を入力し、POSTリクエストを行なった結果、以下のエラーメッセージが出力されました。

Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in /var/www/html/upload.php on line 275

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kyoya0819

2020/07/06 09:35

実行するとエラーは発生しますか?
study_111

2020/07/06 10:01

実行した場合、「Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in /var/www/html/upload.php on line 291」とエラーが表示されました。
study_111

2020/07/06 10:18

コードの方、一部変更を行いました。 それに伴い、変更になったエラーメッセージを追記しました。 確認頂けましたら、幸いです。
m.ts10806

2020/07/06 10:57

PHP7.3以前ならアウト 7.4以降ならセーフの ヒアドキュメント終端の構文ではないでしょうか
study_111

2020/07/06 11:12 編集

ヒアドキュメントの構文がPHP7.4以降でないと対応していないという感じですかね?
guest

回答1

0

自己解決

ヒアドキュメントの終端文字列のEND;の部分を左詰めにしたら、エラーが消えました。

投稿2020/07/06 11:57

study_111

総合スコア82

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問