2017-10-30 18 views
0

cURLを使用してファイルをGoogleドライブのサブディレクトリにアップロードする場合は、TCL構文を使用しています。 documentationに基づいて、サブフォルダIDを保持するparentというプロパティがあります。 "APIセクションを試してください"で正常に動作します。parentsパラメータを削除すると、以下のコードが正常に機能します(ファイルはGDriveのルートフォルダにアップロードされます)。TCLとcURLを使用してGoogleドライブにファイルをアップロード

parents : [{"id" : "0B-b5yS-0xCQjVEcyMm9hYmtqd0k"}] 

は、今私は私の現在のコードにこれを適応したいが、それエラーが発生します。

これは、パラメータがドキュメントに基づいてのようになります方法です。私は問題がTCLの構文に関連していると思っていますが、私は言語に精通していないので、時間を費やしてしまった今、完全に失われました。&エラーが働いています。私がやろうとしているのは、parentフォルダリストでさえ、メタデータに必要なすべての値を保持するパラメータfileMetaDataを設定することです。さらに、最後のcURLステートメントを格納するパラメータcurlCommandを定義します。その中でcurlCommand私はfileMetaDataを提供し、最後にeval execステートメント内のcURLでコマンドを実行します。 私はそれが置換に関連していると思いますか?しかし、私は本当に失われています。私は二重引用符で、中括弧と大括弧の前にバックスラッシュでも試してみました。私はいつもエラーが出ます。

これは、現在のコードです:

set fileMetaData "metadata={name : '$backupFile', title : '$fileName', \ 
          description : 'Backup file from $today', \ 
          parents : [{id : '0B-b5yS-0xCQjVEcyMm9hYmtqd0k'}] }" 

set curlCommand "-H \"GData-Version: 3.0\" \ 
       -H \"Authorization: Bearer $accessToken\" \ 
       -F \"$fileMetaData;type=application/json;charset=UTF-8\" \ 
       -F \"[email protected]$backupFile\" \ 
        https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart" 

catch { eval exec /usr/local/addons/prtz/curl -k $curlCommand}  

コードを実行している間、私は取得エラーメッセージは次のとおりです。

invalid command name "id: '0B-b5yS-0xCQjVEcyMm9hYmtqd0k'" 
while executing "{id: '0B-b5yS-0xCQjVEcyMm9hYmtqd0k'}" 

多分重要:私は厳密にどのなしのネイティブTCL 8.2を使用する必要があります追加ライブラリ(JSONサポート用) 解決方法を理解するのに役立つ入力があれば感謝します。

ありがとうございました。

+0

8.2は長いサポート外の大幅です(別のオプションは、subst -nocommandsだろうが、この場合のために、私はformatが滑らかな印象だと思います。):この場合、あなたはまた、formatを使用してメタデータを構築することができます。 –

+0

私は知っていますが、影響を与えることはできません。まだ2017年にもこのバージョンのハードウェアを提供しているメーカーがあります。 –

答えて

0

リストコマンドでビットごとにコマンドラインを構築するのが最も簡単です。

# Your immediate problem was the square brackets building this value; backslash needed 
set fileMetaData "{name : '$backupFile', title : '$fileName', \ 
        description : 'Backup file from $today', \ 
        parents : \[{id : '0B-b5yS-0xCQjVEcyMm9hYmtqd0k'}\] }" 

set curlCommand {/usr/local/addons/prtz/curl -k} 
lappend curlCommand -H "GData-Version: 3.0" 
lappend curlCommand -H "Authorization: Bearer $accessToken" 
lappend curlCommand -F "metadata=$fileMetaData;type=application/json;charset=UTF-8" 
lappend curlCommand -F "[email protected]$backupFile" 
lappend curlCommand "https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart" 

catch { eval exec $curlCommand } 
# If you were using a supported Tcl (8.5 and later) I'd say use this instead: 
#  catch { exec {*}$curlCommand } 
# but since we've built with lappend there's no surprises anyway. 

リストコマンドを使用すると、リストを正しく構築する方がはるかに簡単です。

set parentID 0B-b5yS-0xCQjVEcyMm9hYmtqd0k 
set description "Backup file from $today" 

set fileMetaData [format \ 
     {{name : '%s', title : '%s', description : '%s', parents : [{id : '%s'}]}} \ 
     $backupFile $fileName $description $parentID] 

+0

一般的には、私は非常に古いバージョンのTcl_にはないJSONライブラリを使用することをお勧めしますあなたがそれについて考える必要がなく、値の中の "予期しない"文字(例えば '' ')など... –

+0

有効なJSONのためにオブジェクトキーも引用したいと思うでしょう。 –

+0

ありがとう!今は期待どおりに働いています。 –

関連する問題