문제

저는 회사에서 Box.com과의 데이터 전송에 사용할 일련의 Powershell 스크립트를 작업 중입니다.내가 알아낼 수 없는 한 가지는 파일을 업로드하는 것입니다.Box API에는 업로드를 위한 다중 부분 POST 작업이 필요하며 여기 SO에서 Powershell에서 해당 작업을 수행할 수 있어야 함을 나타내는 몇 가지 답변을 보았습니다(예: 이 하나).하지만 제대로 작동하지 않는 것 같습니다.

지금 가지고 있는 코드는 다음과 같습니다.

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 매개변수가 올바르지 않은데 어떻게 수정해야 할지 모르겠습니다.에 따르면 박스 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은 기본적으로 지원하지 않는 것 같습니다. multipart/form-data POST에 따라 질문 당신이 참조한 것입니다.

요청 본문이 필요하므로 (1,2) -- 따라서 -InFile 사용할 수 없습니다. (3) -- 직접 굴려야 할 수도 있습니다. multipart/form-data 필요한 메타데이터와 파일 콘텐츠가 포함된 본문(4)입니다. 이 블로그 게시물 그렇게 하기 위한 방법을 설명합니다.내용은 짧은 문자열(트윗)이지만 원리는 동일합니다.

다음은 방금 Box Windows SDK를 사용하여 수행한 업로드에 대한 Fiddler 추적입니다.이는 요청이 회선을 통해 전달되는 방식을 보여줍니다.그만큼 $BOUNDARY 임의의 고유한 문자열입니다. 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