Pregunta

Estoy trabajando en una serie de secuencias de comandos de Powershell para mi empresa a utilizar para transferir datos a y desde Box.com.La única cosa que no puedo averiguar es la carga de archivos.El Cuadro de la API requiere un multipart POST operación de cargas, y yo los he visto un par de respuestas de aquí indicando ASÍ que yo debería ser capaz de hacer que en Powershell (tales como este).Pero me parece que no puede conseguir trabajo.

Este es el código que tengo ahora:

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
}

Aquí está la respuesta me pongo de nuevo:

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

También he intentado un par de otras permutaciones que no están funcionando.He intentado usar el -InFile interruptor en Invoke-RestMethod en lugar de -Body.También he intentado usar Get-Content -Raw en lugar de [IO.File]::ReadAllBytes.Ambos devuelven un error más genérico: The server encountered an internal error or misconfiguration and was unable to complete your request..

Estoy bastante seguro de que esto tiene algo que ver con mi filename parámetro de no ser correcto, pero no estoy seguro de cómo solucionarlo.De acuerdo a la Cuadro de API, aquí es lo que debe verse como en la curvatura.Alguien me puede ayudar correctamente traducir esto para 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
¿Fue útil?

Solución

Hay un par de cosas que hacen de esta un poco complicado en PowerShell:

  1. El filename parámetro especifica el nombre del archivo, no el contenido.
  2. Un cuerpo de solicitud es necesaria para especificar el nombre de archivo y el destino.
  3. PowerShell trata -InFile y -Body argumentos como mutuamente excluyentes.
  4. PowerShell no aparece de forma nativa soporte multipart/form-data Puestos, por la pregunta que usted hace referencia.

Desde el cuerpo de solicitud es necesario (1,2) - y por lo tanto -InFile no se pueden usar (3) - creo que usted puede ser que necesite para rodar su propia multipart/form-data cuerpo (4) que contiene los metadatos necesarios y el contenido de los archivos. Este blog se describe un método para hacerlo.El contenido no es una cadena corta (un tweet), pero el principio es el mismo.

A continuación es un Violinista de seguimiento de la carga acabo de realizar utilizando el Cuadro de SDK de Windows.Esto muestra cómo la solicitud debe mirar como pasa a través del alambre.El $BOUNDARY es arbitraria, única cadena -- un GUID de las grandes obras.

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

Aquí está la respuesta que he recibido:

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", ... }]}

Otros consejos

Puedo parecer tonta, pero ¿qué sucede cuando usted hace esto?

$body.Add("filename",  $([IO.File]::ReadAllBytes($SourcePath)))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top