從 SharePoint 下載多個檔案

大家好,
我想使用 n8n 下載特定 SharePoint 資料夾中的所有檔案(例如 /Shared Documents/Dana)。

我做了什麼

  1. Microsoft SharePoint 節點 → 資源:項目 → 操作:取得多個

    • 這成功地返回了項目。
    • 我也篩選了資料夾(所以我只想要 /Dana 下的檔案)。
  2. 然後我使用迴圈項目 / 分批分割來迴圈結果,並嘗試:

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

我總是收到:

  • 400 不正確的請求 – 請檢查您的參數

我需要幫助的地方

  • 如何從「取得多個項目(項目資源)」輸出中獲取正確的檔案/driveItem ID,以便在檔案 → 下載中使用?
  • 或者,在 n8n 中下載資料夾中的所有檔案的推薦工作流程是什麼:
    • 我應該使用不同的 SharePoint 資源(檔案而不是項目)嗎?
    • 或者我應該使用 HTTP 請求節點搭配 Microsoft Graph 按路徑下載?

n8n 版本: 2.18.7(自主託管)
節點: n8n-nodes-base.microsoftSharePoint(UI 中顯示的最新版本)

嗨 @dana_bida

與其使用「Item」資源來尋找檔案,不如使用「File」資源。這可確保傳回的 ID 與下載操作相容。

  1. 替換你的第一個節點:
    • 資源:File
    • 操作:List
  2. 設定資料夾:
    • 在「List」操作中,你可以指定資料夾路徑或 ID。由於你想要 /Shared Documents/Dana,請確保你是針對該特定資料夾。
  3. 輸出:
    • 由 Resource: File → Operation: List 傳回的 id 是 DriveItem ID。
  4. 下載節點:
    • 將此 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 }} 不為空),以自動排除迴圈中的子資料夾,否則下載步驟將在偷偷進入子項目回應的資料夾項目上失敗。