PowerShellによるファイルのアップロード

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
    }
}

自己解決しました。

フォーマットが問題でした。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。