REST API を利用してファイルアップロード時の文字化けについて

お世話になります。

文字化けについて回避方法を伺いたいです。

現在 PowerShell の Invoke-RestMethod を用いてアプリのJavaScriptファイルを更新しようとしています。

以下の3つのAPIを利用してファイルのアップロードと、カスタマイズへの紐づけ、運用環境への反映までは成功しています。

  1. ファイルアップロード: /k/v1/file.json
  2. JavaScript / CSSカスタマイズ設定変更: /k/v1/preview/app/customize.json
  3. 運用環境への反映: /k/v1/preview/app/deploy.json

アップロードしたファイルの中を確認すると日本語が ?? となってしまっています。

日本語文字列が入っているためURLエンコードをUTF-8とShift-JISで試しましたが

エンコードしたものがそのままファイルに入っているようです。

$fileUpUrl = 'https://{サブドメイン}.cybozu.com/k/v1/file.json'
$ID = "id"
$PASS = "password"
$b64enc=[Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes($ID+":"+$PASS))
$headers = @{'X-Cybozu-Authorization'=$b64enc}

$fileName = 'test.js'
$filePath = Get-Item -Path $fileName
$fileBytes = [System.IO.File]::ReadAllBytes($FilePath);
$fileEnc = [System.Text.Encoding]::GetEncoding('UTF-8').GetString($fileBytes);

$boundary = [System.Guid]::NewGuid().ToString();
$bodyLines = (
  "--$boundary",
  "Content-Disposition: form-data; name=`"file`"; filename=`"test.js`"",
  "Content-Type: application/javascript",
  "",
  $fileEnc,
  "--$boundary--"
  ) -join "`r`n"
$fileKeyRes=Invoke-RestMethod -Method Post -Uri $fileUpUrl -Headers $headers -ContentType "multipart/form-data; boundary=$boundary" -Body $bodyLines

$fileSetUrl = 'https://{サブドメイン}.cybozu.com/k/v1/preview/app/customize.json'
$fileKey = $fileKeyRes.fileKey
$app = 42
$custmizeParams = "{
  ""app"":""$app"",
  ""scope"":""ALL"",
  ""desktop"":{
      ""js"":[{""type"":""FILE"",""file"":{""fileKey"":""$fileKey""}}]
  }
}"
Invoke-RestMethod -Method Put -Uri $fileSetUrl -Headers $headers -Body $custmizeParams -ContentType 'application/json'

$deployUrl = 'https:/{サブドメイン}.cybozu.com/k/v1/preview/app/deploy.json'
$deployParam = "{
  ""apps"":[
      {
          ""app"":""$app"",
          ""revision"":-1
      }
  ],
  ""revert"": false
}"
Invoke-RestMethod -Method Post -Uri $deployUrl -Headers $headers -Body $deployParam -ContentType 'application/json'

 
ファイル名を日本語にした際にURLエンコードを用いると表示上はURLエンコードしたままですが、手動でブラウザを利用してダウンロードするときには日本語のファイル名としてダウンロードされます。

 

URLエンコードは以下の方法でUTF-8とShift_JISで試しました。

現在開発者ライセンスの環境で開発をしています。

[System.Web.HttpUtility]::UrlEncode("あ")
[System.Web.HttpUtility]::UrlEncode("あ",[Text.Encoding]::GetEncoding("SHIFT-JIS"))

 

 

 

 

 

 

 

自己解決しました。

Invoke-RestMethod の -body へ直接渡していたのですが、ここでUTF-8がわたっていると思い込んでいたのがよくなかったようです。

適切な解決策(文字コードの指定での対応)は不明のままなのですが、一度UTF-8のファイルとして書き出し

$bodyLines を $bodyLines | Set-Content -Path "bodylines" -Encoding UTF8

InFileとしてInvoke-RestMethodへ渡すことできちんとUTF-8としてファイル名・ファイルの中身ともに渡すことができました。

$fileKeyRes=Invoke-RestMethod -Method Post -Uri$fileUpUrl-Headers$headers-ContentType"multipart/form-data; boundary=$boundary" -InFile "bodylines"

利用していた環境の記載が漏れていました。

Windows10 22H2  / PowerShell 5.1 

> $PSVersionTable
Name                           Value
----                           -----
PSVersion                      5.1.19041.2364
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.2364
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1