2014-11-21 64 views
6

我試圖來處理客戶端JavaScript onedrive文件,但首先我需要一種方法來使用XMLHttpRequest下載的文件。 Onedrive支持CORS的很多操作,但對於文件下載到JavaScript存在以下問題:Onedrive CORS下載JavaScript的

如這裏提到的:onedrive rest api manual

我可以發送一個請求:

GET https://apis.live.net/v5.0/FILE_ID/content?access_token=ACCESS_TOKEN

它會回覆一個位置標題,將瀏覽器重定向到文件。問題是,當我通過XHR發送這些請求時,瀏覽器始終發送帶有請求的Origin標頭。對於上面描述的第一個請求,onedrive還會使用Access-Control-Allow-Origin:*標題進行回覆,以便在瀏覽器中允許該請求。但是,當瀏覽器重定向到文件的實際位置時,該資源沒有Access-Control-Allow-Origin標頭,所以XHR請求被瀏覽器拒絕(chrome將Origin標頭設置爲null重定向請求)。

我也嘗試獲取位置,但不自動重定向,然後發送另一個XHR請求,這將設置源標題爲我的網站的域,但結果是相同的。

正如我在開頭提到的,我需要處理JavaScript中的數據,所以我不要求有關如何將文件下載到onedrive硬盤驅動器。我需要在網頁中通過javascript訪問數據。

我知道我可以使用服務器端編程爲我獲取文件數據,然後將其發送到客戶端,但對於我的應用程序,這不是一個選項(至少這不是我要求的此時此刻)。

如果沒有辦法做到這一點,沒有人有一個想法,爲什麼他們會實現他們的API這種方式?允許javascript通過cors和重定向獲取位置,但不包括重定向資源的cors頭。爲什麼不首先否認cors?這是一個錯誤?

回答

4

這不是一個答案,我還不能評論。

上週發佈了onedrive的新API。 http://onedrive.github.io/index.htm

不幸的是它不會解決問題。

https://api.onedrive.com/v1.0/drive/root:{path and name}:/content?access_token={token} 

還會重定向到一個的ressource某處https://X.files.1drv.com/.X.

其中將不包含任何訪問控制允許來源頭。 JSON響應中的Url "@content.downloadUrl"也一樣。

我希望微軟將解決在不久的將來這個問題,因爲API是非常有限的使用的時候,因爲你不能從onedrive處理文件的內容與HTML5應用。除了通常的文件瀏覽器。

唯一的解決辦法,這是我目前看到將是一個鍍鉻的應用程序,它可以處理的URL,而不CORS。請參閱https://developer.chrome.com/apps/angular_framework

+0

我可以確認您的回覆...似乎絕對沒有辦法從瀏覽器中的JavaScript應用程序中下載文件。下載URL沒有CORS支持。 – user1936097 2015-04-04 16:59:58

+0

微軟?任何人都可以在這裏...你能評論你的OneDrive API究竟支持CORS嗎?現在我可以從我的單頁應用程序進行身份驗證,創建和刪除文件,但無法下載!?這似乎是一個不太可能的方式來聲稱CORS支持 – user1936097 2015-04-04 17:01:55

+0

我目前整合OneDrive與我們的服務,但說實話,我決定完全放棄支持它,我們必須通過我們自己的服務器路由數據,這是昂貴的,不好的保護隱私並降低安全性。嚴重的是,整整一年過去了,他們沒有做任何事來解決這樣一個簡單而又直接的問題。 – user1419305 2015-12-03 16:15:42

1

對於下載請求,Box的功能完全相同。我沒有發現任何解決此問題的方法,因爲瀏覽器不會讓您的程序訪問302重定向響應的內容。出於安全原因,我不相信,瀏覽器強制遵循重定向請求而不允許用戶干預。

我們終於解決此工作方式是

  1. 瀏覽應用程序發送GET請求,將其轉發到雲服務提供商(盒/ ondrive)服務器。
  2. 服務器將不遵循箱或302重定向響應OneDrive
  3. 的服務器,而不是返回給瀏覽器應用程序,該location字段的302響應頭的內容,其中包含下載網址
  4. 的JavaScript在瀏覽器應用程序中,然後使用url下載文件。
+0

我剛查過..看到我下面的評論。此方法在OneDrive上不起作用(至少現在還不行)。 CORS不支持下載 – user1936097 2015-04-04 17:03:44

3

答案盡我所知,最好的解釋是下載內容不能純粹由JavaScript在瀏覽器中完成。他們爲什麼這樣做?你必須問他們,但我會猜想是一個錯誤,還是一些未明確的「安全問題」。對於它的價值,他們似乎認爲下載內容是文檔在這裏 CORS兼容:https://dev.onedrive.com/misc/working-with-cors.htm

要從OneDrive中,你不能使用 /內容API一個JavaScript應用程序下載文件,因爲這以302重定向迴應。當需要CORS預檢時,明確禁止302重定向 ,如提供授權標頭時的 。

相反,您的應用需要選擇@ content.downloadUrl屬性 ,該屬性會返回/ content將重定向到的相同URL。 然後可以使用XMLHttpRequest直接請求該URL。由於 這些URL是預先驗證的,因此可以在沒有CORS 預檢請求的情況下檢索這些URL。

但是,據我所知,他們錯了。僅僅因爲您不需要預檢請求並不意味着響應符合CORS。您仍然需要響應中的Access-Control-Allow-Origin標頭。

對於任何人想知道,這個仍然是新的圖形API(它本質上是一個代理API的OneDrive API,據我瞭解)的問題。同樣的基本問題仍然存在 - 您可以從您的項目中獲得下載URL,但該URL指向非CORS兼容資源,因此它不會對您有所幫助。

我有一個活動的問題打開與微軟here關於這個問題。對於我的問題已經有了一些迴應(我讓他們通過圖表API公開了下載URL),但我還在等待看看他們是否會提出一個真正的解決方案來從JavaScript下載內容。

如果我在這個問題上得到一個解決方案或真正的答案,我會嘗試在這裏報告,以便其他人在未來可以有一個真正的參考答案。

1

您現在可以在GET請求中使用該項目的「@ content.downloadUrl」屬性。然後沒有重定向。

https://dev.onedrive.com/items/download.htm

返回一個302找到響應重定向到該文件的預認證的下載網址。這是通過項目上的@ content.downloadUrl屬性可用的相同URL。