قم بتحميل ملف إلى Box.com باستخدام Powershell
-
26-12-2019 - |
سؤال
أنا أعمل على سلسلة من البرامج النصية 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:
- ال
filename
تحدد المعلمة اسم الملف، وليس محتوياته. - مطلوب نص الطلب لتحديد اسم الملف والوجهة.
- يعامل باورشيل
-InFile
و-Body
الحجج باعتبارها متنافية. - لا يبدو أن 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)))