sironekotoroの日記

Perl で楽をしたい

Perl で Google Drive API をつかって特定のファイルを更新する

特定のファイルを更新する

ちょっと前、ファイルを Google Drive にアップロードした時は、同名のファイルがある場合でもアップロードが可能でした。

・・・可能でした、っていうか完全に不意打ちでしたが・・・

sironekotoro.hateblo.jp

しかし、ファイルを更新したい時はどうすれば良いのでしょう?ってわけで、やりました。人生で初めて PATCH メソッド使いました。

URI のパラメータにファイル ID を利用していますが、だいたいはアップロードの時と同じ感じですね。

$target_fileid で指定したファイルが更新されます。metadata の値を変えることで、ファイル名やmimeType を更新することも可能です。

#!/usr/bin/env perl
use strict;
use warnings;

use HTTP::Request::Common;
use JSON qw/encode_json/;
use LWP::UserAgent;
use URI::QueryParam;
use URI;

my $target_fileid = '1dZU7-4d52U2pRWsmMLhMEuh8Cpa0m8sI';

my $GOOGLE_DRIVE_UPLOAD_API
    = "https://www.googleapis.com/upload/drive/v3/files/";
my $ACCESS_TOKEN
    = "";

my $bearer = join ' ', ( 'Bearer', $ACCESS_TOKEN );

my $URI = URI->new( $GOOGLE_DRIVE_UPLOAD_API . $target_fileid );

$URI->query_param( uploadType => 'multipart' );

my $ua  = LWP::UserAgent->new;
my $res = $ua->request(
    PATCH $URI,
    'Content-Type' => 'multipart/form-data',
    Authorization  => $bearer,
    Content        => [

        metadata => [
            undef, undef,
            'Content-Type' => 'application/json;charset=UTF-8',
            'Content'      => encode_json(
                {
                    # name     => 'hogefuga.txt',
                    #  mimeType => 'plain/text',
                    #  parents  => ['10kCqEUmWsWlqMdP_vF9pDGrQXFVZ-Lvr'],
                    #  id => $target_fileid,
                },
            ),
        ],

        file => ["./hoge.txt"],
    ],
);

print $res->code . "\n";
print $res->content . "\n";

# 200
# {
#  "kind": "drive#file",
#  "id": "19f2RrocH4I3Mdig0LkmNPghJDZnmq35f",
#  "name": "hoge.txt",
#  "mimeType": "plain/text"
# }