首页 文章

Onedrive cors在javascript下载

提问于
浏览
6

我正在尝试在客户端javascript中处理onedrive文件,但首先我需要一种方法来使用XMLHttpRequest来下载文件 . Onedrive支持很多操作的cors,但是为了将文件下载到javascript中,存在以下问题:

如上所述:onedrive rest api manual

我可以发送请求:

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

它将回复一个位置 Headers ,将浏览器重定向到该文件 . 问题是当我通过XHR发送这些请求时,浏览器总是发送带有请求的Origin头 . 对于我上面描述的第一个请求,onedrive还会回复一个Access-Control-Allow-Origin:*标头,因此浏览器中允许该请求 . 但是,当浏览器重定向到文件的实际位置时,该资源没有Access-Control-Allow-Origin标头,因此浏览器拒绝XHR请求(chrome将Origin标头设置为null重定向请求) .

我也试过获取位置,但没有自动重定向,然后发送另一个XHR请求,这会将原始 Headers 设置为我的网站的域,但结果是相同的 .

正如我在开始时提到的,我需要在javascript中处理数据,所以我不会询问如何将onedrive文件下载到硬盘驱动器 . 我需要在网页上通过javascript访问数据 .

我知道我可以使用服务器端编程为我获取文件数据然后将其发送到客户端,但对于我的应用程序,这不是一个选项(至少这不是我现在要求的) .

如果没有办法做到这一点,有没有人知道为什么他们会以这种方式实现他们的api?允许javascript通过cors获取位置并重定向但不包含重定向资源的cors头 . 为什么不首先否认科尔?这是一个错误吗?

4 回答

  • 1

    这不是答案,我还不能发表评论 .

    上周发布了onedrive的新API . http://onedrive.github.io/index.htm

    不幸的是,它无法解决问题 .

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

    仍然会在 https://X.files.1drv.com/.X. 重定向到某个地方的资源

    其中不包含任何Access-Control-Allow-Origin标头 . JSON响应中的Url "@content.downloadUrl" 也是如此 .

    我希望微软能在不久的将来解决这个问题,因为API目前使用非常有限,因为你无法使用html5应用程序处理来自onedrive的文件内容 . 除了通常的文件浏览器 .

    我目前看到的唯一解决方案是Chrome应用程序,可以在没有CORS的情况下处理Url . 见https://developer.chrome.com/apps/angular_framework

  • 4

    我能说的答案是,下载内容不能完全由浏览器中的JavaScript完成 . 他们为什么这样做?你是值得的,他们似乎认为在这里的文档中下载内容符合CORS:https://dev.onedrive.com/misc/working-with-cors.htm

    要在JavaScript应用程序中从OneDrive下载文件,您无法使用/ content API,因为它会响应302重定向 . 当需要CORS预检时,例如在提供授权标头时,明确禁止302重定向 . 相反,您的应用需要选择@ content.downloadUrl属性,该属性返回/ content将重定向到的相同URL . 然后可以使用XMLHttpRequest直接请求此URL . 由于这些URL是经过预先验证的,因此可以在没有CORS预检请求的情况下检索它们 .

    但是,据我所知,他们错了 . 仅仅因为您不需要预检请求并不意味着响应符合CORS . 您仍然需要响应上的Access-Control-Allow-Origin标头 .

    对于任何想知道的人来说,这仍然是新的Graph API中的一个问题(根据我的理解,它实际上是OneDrive API的代理API) . 仍然存在相同的基本问题 - 您可以从您的项目中获取下载URL,但该URL指向非CORS兼容的资源,因此它不会给您带来很多好处 .

    我有一个与Microsoft here有关此问题的活动问题 . 对我的问题做了一些回应(我让它们通过图形API公开下载URL),但是我想出了一个从JavaScript下载内容的真正解决方案 .

    如果我在这个问题上得到解决方案或真正的答案,我会尝试在这里报告,以便将来的其他人可以得到真正的参考答案 .

  • 4

    Box对下载请求完全一样 . 没有找到解决这个问题的方法涉及服务器,因为浏览器不会让您的程序访问302重定向响应的内容 . 出于安全原因,我不相信,浏览器强制要求重定向请求,而不允许用户干预 .

    我们最终解决这个问题的方式是

    • 浏览器应用程序将GET请求发送到服务器,服务器将其转发给 Cloud 提供商(box / ondrive) .
      然后

    • 服务器不遵循Box或OneDrive的302重定向响应

    • 服务器改为返回浏览器应用程序,302响应头中的 location 字段的内容,其中包含下载URL

    • 浏览器应用程序中的javascript然后使用url下载文件 .

  • 1

    您现在可以使用GET请求中项目的“@ content.downloadUrl”属性 . 然后没有重定向 .

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

    返回302 Found响应,重定向到文件的预先验证的下载URL . 这是通过项目上的@ content.downloadUrl属性提供的相同URL .

相关问题