web-dev-qa-db-ja.com

APIを介してGoogleドライブにファイルを追加/作成/挿入するにはどうすればよいですか?

APIを介したGoogleドライブへのファイルの挿入に関するヘルプが必要です。この目的のためのAPIドキュメントでは、httpポストリクエストを介してファイルの実際の本文を送信する方法を明確に説明していません。

32
Niranja

挿入操作に関するドキュメント には、すでに多数のプログラミング言語の例が含まれています。ここでは、Google Drive APIのHTTPベースのプロトコルを使用してそれを行う方法を示します。

まず、POSTドライブエンドポイントへの新しいファイルメタデータ。 ファイルリソースJSONオブジェクト の形式である必要があります。

POST /drive/v2/files HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer <OAuth 2.0 access token here>
...

{
  "title": "file_name.extension",
  "mimeType": "mime/type",
  "description": "Stuff about the file"
}

応答本文は、新しく作成されたFileリソースのJSON表現になります。次のようになります。

{
  "kind": "drive#file",
  "id": string,
  "etag": etag,
  "selfLink": string,
  "title": "file_name",
  "mimeType": "mime/type",
  "description": "Stuff about the file"
  ...
  "downloadUrl": string,
  ...
}

これは、ファイルエントリが作成されたことの確認です。次に、コンテンツをアップロードする必要があります。そのためには、上記のレスポンスのidJSON属性で指定されたファイルのIDを取得し、実際のファイルのコンテンツをOAuth 2.0承認済みリクエスト。次のようになります。

PUT /upload/drive/v2/files/{id}?uploadType=media HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer <OAuth 2.0 access token here>
Content-Type: mime/type

<file content here>

完了です:)

また、コンテンツと同時にファイルのメタデータを投稿するマルチパートリクエストを使用して、1つのPOSTリクエストでこれを行う方法もあります。以下に例を示します。

POST /upload/drive/v2/files HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer <OAuth 2.0 access token here>
Content-Type: multipart/form-data; boundary=287032381131322
...

--287032381131322
Content-Type: application/json

{
  "title": "file_name.extension",
  "mimeType": "mime/type",
  "description": "Stuff about the file"
}
--287032381131322
Content-Type: mime/type

<file content here>
--287032381131322--

応答には、新しく作成されたファイルのメタデータが含まれます。リクエストのサブパートでContent-Transfer-Encoding:base64ヘッダーを使用して、ファイルのデータをBase 64エンコード。

最後に 再開可能アップロードプロトコル もあります。これは大きなファイルをアップロードしたり、一時停止/再開機能を提供したり、不安定なインターネット接続でファイルをアップロードしたりするのに便利です。

PS:現在、このほとんどは ドライブのファイルアップロードドキュメント で説明されています。

65
Nicolas Garnier

説明してくれてありがとう!これには、くだらないgoogle SDKのドキュメンテーションを巡って何時間もかけて回りました(申し訳ありませんが、私は暴言を出さなければなりませんでした)。

テキストファイルを更新する関数を作成しました(HTMLを更新していることがわかります)。

  function Gd_updateFile(fileId, folderId, text, callback) {

    const boundary = '-------314159265358979323846';
    const delimiter = "\r\n--" + boundary + "\r\n";
    const close_delim = "\r\n--" + boundary + "--";

    var contentType = "text/html";
    var metadata = {'mimeType': contentType,};

    var multipartRequestBody =
        delimiter +  'Content-Type: application/json\r\n\r\n' +
        JSON.stringify(metadata) +
        delimiter + 'Content-Type: ' + contentType + '\r\n' + '\r\n' +
        text +
        close_delim;

    if (!callback) { callback = function(file) { console.log("Update Complete ",file) }; }

    gapi.client.request({
        'path': '/upload/drive/v2/files/'+folderId+"?fileId="+fileId+"&uploadType=multipart",
        'method': 'PUT',
        'params': {'fileId': fileId, 'uploadType': 'multipart'},
        'headers': {'Content-Type': 'multipart/mixed; boundary="' + boundary + '"'},
        'body': multipartRequestBody,
        callback:callback,
    });
  }

これは、Googleの例(アップロードのバイナリファイルを使用)と、上記の@Nivcoのニースの説明のマッシュアップです。

17
user1158023

4年後、これを理解するのはまだ困難です。画像のアップロードをサポートするために、@ user1158023の回答を受け取りました。 API v3とsuperagent.jsを使用して支援しています(gapi.client.requestがcontent.googleapis.com !?にリクエストを送信しているため)。うまくいけば、誰かがこれを役に立つと思うかもしれません。

function Gd_uploadFile(name, contentType, data, callback) {
    const boundary = '-------314159265358979323846';
    const delimiter = "\r\n--" + boundary + "\r\n";
    const close_delim = "\r\n--" + boundary + "--";

    contentType = contentType || "text/html";
    var metadata = {
        name: name,
        'mimeType': contentType
    };

    var multipartRequestBody =
        delimiter +  'Content-Type: application/json\r\n\r\n' +
        JSON.stringify(metadata) +
        delimiter +
        'Content-Type: ' + contentType + '\r\n';

    //Transfer images as base64 string.
    if (contentType.indexOf('image/') === 0) {
        var pos = data.indexOf('base64,');
        multipartRequestBody += 'Content-Transfer-Encoding: base64\r\n' + '\r\n' +
            data.slice(pos < 0 ? 0 : (pos + 'base64,'.length));
    } else {
        multipartRequestBody +=  + '\r\n' + data;
    }
    multipartRequestBody += close_delim;

    if (!callback) { callback = function(file) { console.log("Update Complete ", file) }; }

    superagent.post('https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart').
        set('Content-Type', 'multipart/form-data;  boundary="' + boundary + '"').
        set('Authorization', 'Bearer ' + gapi.auth.getToken().access_token).
        send(multipartRequestBody).
        end(function () {
            console.log(arguments);
        });
}

//On upload
$('#file')[0].onchange = function () {
    var file = $('#file')[0].files[0];
    if (file && file.type === 'image/jpeg') {
        var reader = new FileReader();
        reader.onloadend = function () {
            var data = reader.result;
            Gd_uploadFile('img.jpg', 'image/jpeg', data, function () {
                console.log(arguments);
            });
        }
        reader.readAsDataURL(file);
    }
};

index.html

...
<form>
    <span>Upload: </span><input id="file" type="file" name="myFile">
</form>
...
7
Munawwar

ドライブガピスv3にはもっと良い例がありました...

gapi.client.drive.files.create({ "name" : "savefile.txt" }).execute(function(file) { console.log("Created file " + file.name + " id: " + file.id); });

最終的には、fileIdをパスに追加し、メソッドをPATCHに変更するという「幸運な」組み合わせを試しました

function uploadFile(id, text)                                                                                                                                                          
{
  var auth_token = gapi.auth.getToken().access_token;

  const boundary = '-------314159265358979323846';
  const delimiter = "\r\n--" + boundary + "\r\n";
  const close_delim = "\r\n--" + boundary + "--";

  var metadata = { 
      description : 'savefile for my game',
      'mimeType': 'application/json'
  };  

  var multipartRequestBody =
    delimiter +  'Content-Type: application/json\r\n\r\n' +
    JSON.stringify(metadata) +
    delimiter + 'Content-Type: application/json\r\n\r\n' +
    text +
    close_delim;

  gapi.client.request
    ( { 
     'path': '/upload/drive/v3/files/'+id,
     'method': 'PATCH',
     'params': {'fileId': id, 'uploadType': 'multipart'},
     'headers': { 'Content-Type': 'multipart/form-data; boundary="' + boundary + '"', 'Authorization': 'Bearer ' + auth_token, },
     'body': multipartRequestBody 
     }).execute(function(file) { console.log("Wrote to file " + file.name + " id: " + file.id); }); 
}

しかし、今では https://developers.google.com/drive/v3/reference/files/update のドキュメント全体が私にとって理にかなっていると思います:-)

3
renato

Google Drive API チーム リリースv 2015年末に、そのリリースでは、insert()は名前をcreate()に変更しました。ファイル操作をよりよく反映するため。ドキュメントも改善されました:Java、Python、PHP、C#/。NET、Ruby、JavaScriptのサンプルコードに付属する アップロード専用の特別なガイド (シンプル、マルチパート、再開可能)が追加されました。 /Node.js、およびiOS/Obj-Cは通常のファイルをアップロードし、もう1つはCSVファイルをGoogleスプレッドシートとしてインポートします。

わかりやすいように、以下に1つalternatePythonソリューション(ドキュメントのサンプル)) apiclient.http.MediaFileUploadクラスを必要としない短いファイル(「シンプルアップロード」)このスニペットは、サービスエンドポイントがDRIVEで、https://www.googleapis.com/auth/drive.fileの最小認証スコープで認証コードが機能すると想定しています。

# filenames & MIMEtypes
DST_FILENAME = 'inventory'
SRC_FILENAME = DST_FILENAME + '.csv'
SHT_MIMETYPE = 'application/vnd.google-apps.spreadsheet'
CSV_MIMETYPE = 'text/csv'

# Import CSV file to Google Drive as a Google Sheets file
METADATA = {'name': DST_FILENAME, 'mimeType': SHT_MIMETYPE}
rsp = DRIVE.files().create(body=METADATA, media_body=SRC_FILENAME).execute()
if rsp:
    print('Imported %r to %r (as %s)' % (SRC_FILENAME, DST_FILENAME, rsp['mimeType']))

Androidアプリを作成している場合は、独自のドキュメントセットを持つ別個の Android用GoogleドライブAPI があります。最後に、JavaScriptを使用している場合Google Apps Scriptでは、 ドライブサービスネイティブオブジェクトドライブアドバンスドサービス の両方がまだAPIのv2を使用しています。

2
wescpy