سؤال

أنا أعمل على سلسلة من البرامج النصية Powershell لشركتي لاستخدامها في نقل البيانات من وإلى Box.com.الشيء الوحيد الذي لا أستطيع اكتشافه هو تحميل الملفات.تتطلب 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 المعلمة غير صحيحة، لكني لست متأكدًا من كيفية إصلاحها.بحسب ال واجهة برمجة تطبيقات الصندوق, ، إليك ما يجب أن يبدو عليه في الضفيرة.هل يمكن لأي شخص مساعدتي في ترجمة هذا بشكل صحيح لـ 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. يعامل باورشيل -InFile و -Body الحجج باعتبارها متنافية.
  4. لا يبدو أن PowerShell يدعم أصلاً multipart/form-data المشاركات، لكل سؤال التي أشرت إليها.

بما أن نص الطلب مطلوب (1،2) - وهكذا -InFile لا يمكن استخدامها (3) - أعتقد أنك قد تحتاج إلى لفها بنفسك multipart/form-data النص (4) الذي يحتوي على بيانات التعريف الضرورية ومحتوى الملف. هذا بلوق وظيفة يصف طريقة للقيام بذلك.المحتوى هناك عبارة عن سلسلة قصيرة (تغريدة) ولكن المبدأ هو نفسه.

يوجد أدناه تتبع Fiddler لعملية تحميل قمت بها للتو باستخدام Box Windows SDK.يوضح هذا كيف يجب أن يبدو الطلب أثناء مروره عبر السلك.ال $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