PowerShellからファイルアップロードAPIを利用してcsvファイルをアップロードしようとすると下記のレスポンスが返却されアップロードできません。何が原因かわかりません。いろいろと試しているのですがうまくいきません。どなたか情報をお持ちの方ご教示ください
{
“code”: “GAIA_HM02”,
“id”: “xQYNUGB7RCBjFE1OMHma”,
“message”: “アップロードするHTTPリクエストの形式が正しくありません。HTTPリクエストはマルチパート形式である必要があります。”
}
●ソースコード
#参考
#https://developer.cybozu.io/hc/ja/articles/202350470
# インポートするCSVファイル
$filePath = "user_import_test.csv"
# レスポンスを書き込むファイル
$responseFilePath = "response.csv"
# ファイルアップロードAPIの URI
$FileUploadURI = 'https://xxxxx.cybozu.com/k/v1/file.json'
$tempFile = 'xxxxxxx'
# ID / Password
$ID = 'xxxxx'
$Pass = 'xxxxx'
# 「:」で連結する
$AuthrzationStr = $ID + ':' + $Pass
# バイト配列にする
$Byte = [System.Text.Encoding]::UTF8.GetBytes($AuthrzationStr)
# BASE 64 にする
$Base64 = [System.Convert]::ToBase64String($Byte)
$boundary = "---------------------------aaaa"
$contentType = "multipart/form-data; boundary=$boundary"
# リクエストヘッダー
$headers = @{
'X-Cybozu-Authorization' = $Base64
}
#入力ファイル
$fileName = [System.IO.Path]::GetFileName($filePath)
$UTF8woBOM = New-Object "System.Text.UTF8Encoding" -ArgumentList @($false)
$sw = New-Object System.IO.StreamWriter($tempFile, $false, $UTF8woBOM)
$sw.Write("--$boundary`n")
$sw.Write("Content-Disposition: form-data; name=`"file`"; filename=`"$fileName`"`n")
$sw.Write("Content-Type: text/csv`n")
$sw.Write("`n")
$sw.Close()
#ファイル内容書き出し
$fs = New-Object System.IO.FileStream($tempFile, [System.IO.FileMode]::Append)
$bw = New-Object System.IO.BinaryWriter($fs)
$fileBinary = [System.IO.File]::ReadAllBytes($filePath)
$bw.Write($fileBinary)
$bw.Close()
#最後のboundary
$sw = New-Object System.IO.StreamWriter($tempFile, $true, $UTF8woBOM)
$sw.Write("`n--$boundary--`n")
$sw.Close()
# POST API を叩く
try {
$response = Invoke-RestMethod -Uri $FileUploadURI -Headers $headers -Method POST -ContentType $contentType -InFile $tempFile
# レスポンスをファイルへ書込
if ($response -is [string]) {
$response | Out-File -FilePath $responseFilePath
} elseif ($response -is [System.Management.Automation.PSCustomObject]) {
$response | ConvertTo-Json | Out-File -FilePath $responseFilePath
} else {
$response | Out-File -FilePath $responseFilePath
}
} catch {
if ($_.Exception.Response -eq $null) {
echo $_.Exception
} else {
echo $_.Exception.Response.StatusCode
$result = $_.Exception.Response.GetResponseStream()
$reader = New-Object System.IO.StreamReader($result)
$reader.BaseStream.Position = 0
$reader.DiscardBufferedData()
$responseBody = $reader.ReadToEnd()
echo $responseBody
}
}