PowerShellを使用してBox.comにファイルをアップロードします
-
26-12-2019 - |
質問
私はBOX.comとの間のデータを転送するために使用するための一連のPowerShellスクリプトに取り組んでいます。私が理解できないことの一つはファイルをアップロードしています。 Box APIはアップロードのためのマルチパートポスト操作を必要とし、ここでいくつかの回答を見ました。 / 22491129 / send-multipart-form-data-with-powershell-invoke-restmethod ">この1つ)。しかし、私はそれを作業するように思われることはできません。
これは私が今持っているコードです:
Function Post-File {
Param(
[Parameter(Mandatory=$True,Position=1)]
[string]$SourcePath,
[Parameter(Mandatory=$False,Position=2)]
[string]$FolderId = ############
)
#Variables for building URIs
$baseUrl = "https://upload.box.com/api/2.0/files/content"
#Set Authorization for API requests
$headers = @{}
$AccessToken = Refresh-Tokens #A reference to another function that definitely works
$headers.Add("Authorization", "Bearer $AccessToken")
#Set POST content
$body = @{}
$body.Add("filename", [IO.File]::ReadAllBytes($SourcePath))
$body.Add("parent_id", $FolderId)
#Upload the file
Invoke-RestMethod -Uri $baseUrl -Method Post -Headers $headers -ContentType "multipart/form-data" -Body $body
}
.
これは私が戻ってきた回答です:
{
"type":"error",
"status":400,
"code":"invalid_request_parameters",
"help_url":"http://developers.box.com/docs/#errors",
"message":"Invalid input parameters in request",
"request_id":"1764475572534bcddfe04b7"
}
.
私はまた、機能していない他の順列を試みました。 -InFile
の代わりにInvoke-RestMethod
の-Body
スイッチを使用してみました。 Get-Content -Raw
の代わりに[IO.File]::ReadAllBytes
を使用してみました。どちらもより一般的なエラーを返します.The server encountered an internal error or misconfiguration and was unable to complete your request.
。
私のfilename
パラメータを正しくないものではないものにすることができると確信していますが、修復方法はわかりません。 box api によるとカール。誰かが私がPowerShellのためにこれを正しく翻訳するのを助けることができますか?
https://upload.box.com/api/2.0/files/content \
-H "Authorization: Bearer ACCESS_TOKEN" \
-F filename=@FILE_NAME \
-F parent_id=PARENT_FOLDER_ID
. 解決
PowerShellでこれを少しトリッキーにするカップルがあります:
-
filename
パラメータは、内容ではなくファイルの名前を指定します。 - ファイル名と宛先を指定するために要求本文が必要です。
- PowerShellは、
-InFile
と-Body
引数を相互に排他的なものとして扱います。 - PowerShellは、質問参照されています。
要求本文は(1,2) - したがってmultipart/form-data
を使用できません(3) - 必要なメタデータとファイルを含む独自の-InFile
本体(4)をロールする必要があるかもしれないと思いますコンテンツ。 このブログPOST では、その方法を説明しています。コンテンツは短い文字列(ツイート)がありますが、原則は同じです。
multipart/form-data
は任意の固有の文字列です.GUIDは素晴らしい機能です。
POST https://upload.box.com/api/2.0/files/content HTTP/1.1
Authorization: Bearer $TOKEN
Content-Type: multipart/form-data; boundary="$BOUNDARY"
Host: upload.box.com
Content-Length: 2118
Accept-Encoding: gzip, deflate
--$BOUNDARY
Content-Disposition: form-data; name="file"; filename="$FILENAME"
<THE CONTENT OF $FILENAME>
--$BOUNDARY
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data; name="metadata"
{"parent":{"id":"$PARENT_FOLDER_ID"},"name":"$FILENAME"}
--$BOUNDARY--
.
これは私が受け取った応答です:
HTTP/1.1 201 Created
Date: Mon, 14 Apr 2014 12:52:33 GMT
Server: Apache
Cache-Control: no-cache, no-store
Content-Length: 364
Connection: close
Content-Type: application/json
{"total_count":1,"entries":[{"type":"file","id":"$ID","name":"$FILENAME", ... }]}
.他のヒント
私は馬鹿げたかもしれませんが、あなたがこれを行うとき何が起こるのか?
$body.Add("filename", $([IO.File]::ReadAllBytes($SourcePath)))
.