質問

私は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でこれを少しトリッキーにするカップルがあります:

  1. filenameパラメータは、内容ではなくファイルの名前を指定します。
  2. ファイル名と宛先を指定するために要求本文が必要です。
  3. PowerShellは、-InFile-Body引数を相互に排他的なものとして扱います。
  4. PowerShellは、質問参照されています。
  5. 要求本文は(1,2) - したがってmultipart/form-dataを使用できません(3) - 必要なメタデータとファイルを含む独自の-InFile本体(4)をロールする必要があるかもしれないと思いますコンテンツ。 このブログPOST では、その方法を説明しています。コンテンツは短い文字列(ツイート)がありますが、原則は同じです。

    下記は、Box Windows SDKを使用して行ったばかりのアップロードのフィドラートレースです。これは、リクエストがワイヤを越えて表示されるように見える方法を示しています。 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)))
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top