大家好,
我想使用 n8n 下載特定 SharePoint 資料夾中的所有檔案(例如 /Shared Documents/Dana)。
我做了什麼
-
Microsoft SharePoint 節點 → 資源:項目 → 操作:取得多個
- 這成功地返回了項目。
- 我也篩選了資料夾(所以我只想要
/Dana 下的檔案)。
-
然後我使用迴圈項目 / 分批分割來迴圈結果,並嘗試:
- Microsoft SharePoint 節點 → 資源:檔案 → 操作:下載
- 但該節點只支援**「按 ID」**(我的版本中沒有「按路徑」選項),所以我需要一個檔案 ID。
我在「取得多個項目」輸出中看到的內容
每個返回的記錄都有以下欄位:
id:1(似乎是清單項目 ID)
webUrl:https://.../Shared%20Documents/Dana/sample.txt
contentType.id:0x0120...(內容類型)
parentReference.id:c5c59b33-8fc3-44a5-915f-9c608c03731c
parentReference.siteId:elbitsystems.sharepoint.com,0f496d07-...,303451ee-...
parentReference.listId:ecc55e50-...
問題
當我嘗試使用 SharePoint 檔案 → 下載節點下載時:
- 傳遞
webUrl 失敗(預期為 ID)
- 傳遞
id 失敗(似乎是清單項目 ID,而不是檔案/driveItem ID)
- 傳遞
contentType.id 失敗(不是檔案 ID)
- 傳遞
parentReference.id 失敗(看起來像父資料夾 ID)
我總是收到:
我需要幫助的地方
- 如何從「取得多個項目(項目資源)」輸出中獲取正確的檔案/driveItem ID,以便在檔案 → 下載中使用?
- 或者,在 n8n 中下載資料夾中的所有檔案的推薦工作流程是什麼:
- 我應該使用不同的 SharePoint 資源(檔案而不是項目)嗎?
- 或者我應該使用 HTTP 請求節點搭配 Microsoft Graph 按路徑下載?
n8n 版本: 2.18.7(自主託管)
節點: n8n-nodes-base.microsoftSharePoint(UI 中顯示的最新版本)
嗨 @dana_bida
與其使用「Item」資源來尋找檔案,不如使用「File」資源。這可確保傳回的 ID 與下載操作相容。
- 替換你的第一個節點:
- 設定資料夾:
- 在「List」操作中,你可以指定資料夾路徑或 ID。由於你想要
/Shared Documents/Dana,請確保你是針對該特定資料夾。
- 輸出:
- 由
Resource: File → Operation: List 傳回的 id 是 DriveItem ID。
- 下載節點:
- 將此
id 直接傳入 Resource: File → Operation: Download。這樣就能解決 400 Bad Request 錯誤了。
如果內建的「File → List」操作無法提供你需要的確切篩選,你可以直接使用 Microsoft Graph API。這對於深層資料夾結構來說通常更可靠。
步驟 1:列出資料夾中的檔案 使用 HTTP Request 節點:
- 方法:
GET
- URL:
https://graph.microsoft.com/v1.0/sites/{{siteId}}/drive/root:/Shared Documents/Dana:/children
- (將
{{siteId}} 替換為你的網站 ID,或使用網站的主機名稱/路徑格式)。
- 驗證:使用相同的 SharePoint/Microsoft 認證。
步驟 2:迴圈並下載 回應會包含一個 value 陣列。該陣列中的每個物件都有一個 id 欄位。此 id 就是 driveItemId。
- 將此
id 傳入你現有的 Microsoft SharePoint → Resource: File → Operation: Download 節點。
這樣有幫助嗎?
@dana_bida Item → Get Many 的 id 是清單項目的 id,但 Download 需要的是 driveItem id,這就是你的 400 錯誤。最簡單的修復方法是完全跳過 download 節點,Graph children 呼叫已經為每個檔案提供了預先簽署的下載連結,所以你只需要 GET 該連結,無需進行 id 轉換:
將 SITE_ID 替換為你在輸出中已經看到的 parentReference.siteId,在第一個節點上重複使用你現有的 SharePoint OAuth 認證,並將下載節點的認證設為 None,因為該 url 已經是預先簽署的。如果該下載連結傳回空值(應用程式專用認證會這樣做),改為將該節點指向 /sites/SITE_ID/drive/items/{{ $json.id }}/content 並附上你的認證。
取得檔案清單後,在回應中存在的檔案上新增一個「篩選」節點(即 {{ $json.file }} 不為空),以自動排除迴圈中的子資料夾,否則下載步驟將在偷偷進入子項目回應的資料夾項目上失敗。