LoginSignup
2
3

LINE WORKS API 2.0 を PowerShell で叩いてみる (その3 : ファイルのアップロード)

Last updated at Posted at 2022-05-23

今回は、ユーザーの写真を登録してみます。
ユーザーの写真登録は、ファイル アップロードを行うことで実現できます。

LINE WORKS API を利用したファイルのアップロードは、一度、ファイルアップロードのための URL を取得する API を呼び出し、取得した URL に対して改めてファイルを POST することで行います。

ファイルのアップロード URL へのファイルの POST は、その他の API を呼び出す場合とは Header 情報が異なるので、LINE WORKS API 2.0 を PowerShell で叩いてみる (その1 : JWT の処理) で作った $Header ををのまま利用することができません。

LINE WORKS API 2.0 を PowerShell で叩いてみる (その1 : JWT の処理)で Token を取得した際に Token を SecureString として取っておき、のちほど、この Token を使ってファイル アップロードを行うことにします。

# ここまで省略
$url = 'https://auth.worksmobile.com/oauth2/v2.0/token'
$response = Invoke-RestMethod -Uri $url -Method POST -Headers $requestHeader -Body $requestBody

# 追加 : Token を SecureString として残しておく
$secToken = $response.access_token | ConvertTo-SecureString -AsPlainText -Force

まずは、ファイルのアップロード先 URL を取得します。
userId も、nextCursor と同様、URL エンコードが必要ですのでご注意ください

$filePath = 'C:\tmp\photo.jpg'
$file= get-item $filePath 

$userId = 'user@yourcompany'
# userId は Path Parameter のため、URL Encode が必要
$urlEncodedUserId =  [System.Web.HttpUtility]::UrlEncode($userId)
$getUploadUrlAPI = "https://www.worksapis.com/v1.0/users/$urlEncodedUserId/photo"

$body = @{
    fileName = $file.Name
    fileSize = $file.Length
}

$Response = Invoke-RestMethod -Method POST -Uri $getUploadUrlAPI -Headers $Header -body (ConvertTo-Json $body)  
$uploadURL = $Response.UploadUrl

この $uploadURL に、multipart/form-data 形式でコンテンツを POST します。

$ContenType = 'image/jpeg'
$boundary = [System.Guid]::NewGuid().ToString() 

$fileBinary = [IO.File]::ReadAllBytes($filePath)
$enc = [System.Text.Encoding]::GetEncoding("iso-8859-1")
$fileContent = $enc.GetString($fileBinary)

$LF = "`r`n"
$fileNameBytes =  $enc.GetString([System.Text.Encoding]::UTF8.GetBytes($file.Name))
$requestBody = (
    "--$boundary",
    "Content-Disposition: form-data; name=`"resourceName`"; filename=`"$($fileNameBytes)`"",
    "Content-Type: $ContenType$LF",
    $fileContent,
    "--$boundary--$LF"
) -join $LF


# ここでは、Header 情報を事前に作成せずに Invoke-RestMethod を呼び出している
# ConentType と認証情報は、個別に引数として指定
Invoke-RestMethod -Uri $uploadURL -Method POST -body $requestBody -Authentication Bearer -Token $secToken -ContentType "multipart/form-data; boundary=$boundary; charset=iso-8859-1"

これで、ユーザーの写真が登録できました。

2
3
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3