Powershell을 사용하여 Box.com에 파일 업로드
-
26-12-2019 - |
문제
저는 회사에서 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에서는 이를 약간 까다롭게 만드는 몇 가지 사항이 있습니다.
- 그만큼
filename
매개변수는 내용이 아닌 파일 이름을 지정합니다. - 파일 이름과 대상을 지정하려면 요청 본문이 필요합니다.
- PowerShell 처리
-InFile
그리고-Body
주장은 상호 배타적이다. - 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)))
.