【问题标题】:How to download XML files from Firebase Storage?如何从 Firebase 存储下载 XML 文件?
【发布时间】:2016-10-23 19:02:38
【问题描述】:

我正在为 AIR Android 开发个人项目。我正在使用带有 Action Script 3.0 的 REST API。我已经成功实现了认证、上传和删除文件,但是我无法下载文件。我只有 xml 文件,每个用户都有他/她的文件。这是我尝试过的。

首先我得到一个新的令牌:

private function refreshToken(idToken:String):void
    {
        var header:URLRequestHeader = new URLRequestHeader("Content-Type", "application/json");

        var myObject:Object = new Object();
        myObject.grant_type = "authorization_code";
        myObject.code = idToken;

        var request:URLRequest = new URLRequest("https://securetoken.googleapis.com/v1/token?key="+FIREBASE_API_KEY);
        request.method = URLRequestMethod.POST;
        request.data = JSON.stringify(myObject);
        request.requestHeaders.push(header);

        var loader:URLLoader = new URLLoader();
        loader.addEventListener(flash.events.Event.COMPLETE, refreshTokenLoaded);
        loader.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
        loader.load(request);   
    }

加载新令牌后:

private function refreshTokenLoaded(event:flash.events.Event):void
    {
        trace("idToken refreshed!");
        var rawData:Object = JSON.parse(event.currentTarget.data);
        var newIdToken:String = rawData.access_token;
        settings.xmlDB.oauthAccessToken.@value = newIdToken;
        settings.updateXML();

        downloadMetadata();

        trace(event.currentTarget.data);
    }

在下载文件之前,我会获取该文件的元数据:

private function downloadMetadata(authToken:String):void
    {
        var header:URLRequestHeader = new URLRequestHeader("Authorization", "Bearer "+authToken);         

        var request:URLRequest = new URLRequest("https://firebasestorage.googleapis.com/v0/b/spesa-febea.appspot.com/o/data%2F"+settings.xmlDB.localId.@value+"%2FDatabase");
        request.method = URLRequestMethod.POST;
        request.requestHeaders.push(header);

        var loader:URLLoader = new URLLoader();
        loader.addEventListener(Event.COMPLETE, metadataLoaded);
        loader.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
        loader.load(request);

    }

“数据库”是其中一个文件的名称。加载元数据后:

private function metadataLoaded(event:Event):void
    {
        trace(event.currentTarget.data);
        var rawData:Object = JSON.parse(event.target.data);

        trace("DOWNLOAD TOKENS: ", rawData.downloadTokens);
       downloadPrivateFile(rawData.downloadTokens, "Database", settings.xmlDB.localId.@value);
    }

然后我尝试下载文件:

private function downloadPrivateFile(downloadTokens:String, fileName:String, localId:String):void
    {
        trace("downloading");
        var request:URLRequest = new URLRequest("https://firebasestorage.googleapis.com/v0/b/spesa-febea.appspot.com/o/data%2F" + localId + "%2F" + fileName + "?alt=media&token="+downloadTokens);
        navigateToURL(request);

        var loader:URLLoader = new URLLoader();
        loader.load(request); // to get the contents of the xml
        loader.addEventListener(Event.COMPLETE, onFileContentLoaded, false, 0, true);
        loader.addEventListener(IOErrorEvent.IO_ERROR, errorHandler, false, 0, true);
    }

首先我只尝试过 导航到 URL(); 但这似乎不起作用,所以我尝试使用:

URLLoader();

获取 xml 文件的内容,然后将其粘贴到存储在设备上的文件中。但是无论我做什么,我总是会得到这个错误:

{
 "error": {
 "code": 403,
 "message": "Permission denied. Could not perform this operation"
 }
}

navigateToURL() 在浏览器中显示相同的错误。而 URLLoader 在输出窗口中显示相同的错误。这也将 xml 文件的内容替换为错误 - 存储在 Firebase 存储上的文件。我尝试重新检查代码。在输出窗口中成功跟踪文件的元数据。我检查了我的规则。规则没有问题。我已经为此工作了大约一个星期,但仍然无法弄清楚发生了什么。任何帮助将不胜感激。

在进一步测试中,我发现来自 Firebase Stoage 和 request.url(); 的“下载 url”中的下载令牌;不一样。

从 Firebase 下载网址:

复制并粘贴到新选项卡时,此 url 显示 xml 文件的正确内容 https://firebasestorage.googleapis.com/v0/b/spesa-febea.appspot.com/o/data%2FUbgGtcJrt1MOV5ClC1LAEt2sLou1%2FDatabase?alt=media&token=1c94ab22-2260-4d3e-b5f9-28a746353b81

从 request.url() 下载 url: 虽然此 url 显示上述错误并用它替换 xml 内容。 https://firebasestorage.googleapis.com/v0/b/spesa-febea.appspot.com/o/data%2FUbgGtcJrt1MOV5ClC1LAEt2sLou1%2FDatabase?alt=media&token=6025eb7a-4453-4714-9150-4f3aec239615

【问题讨论】:

    标签: actionscript-3 air firebase-storage


    【解决方案1】:
    1. 如果您需要在浏览器中打开数据,请使用navigateToURL(rq),或者如果您想在您的应用程序中获取数据 然后使用 [URLLoader].load()
      1. 请查看 URLLoaderDataFormat(二进制 | 文本 | 变量)最好的 XML 是文本。
      2. 阅读以下内容:URLRequestDefaults(如果您需要使用缓存或需要跟随重定向)
      3. 请记住 Error HTTP 403 Forbidden 可能您需要重定向您的请求而不是创建新的(可能是您在更改中失去了令牌授予)

    【讨论】:

    • 您向 fb 服务器发送请求并且此响应正常,您需要重定向的数据无需关闭父请求即可获得好的最终答案。但是您在新请求中发送此数据,然后服务器不认识您并返回错误。
    【解决方案2】:

    您没有将授权标头添加到您的呼叫中,它必须是一个 POST... 添加这个:

    var header:URLRequestHeader = new URLRequestHeader("Authorization", "Bearer "+authToken);
    

    ...

    request.method = URLRequestMethod.POST;
    request.requestHeaders.push(header);
    

    【讨论】:

    • 感谢您的回答。我试过这个但没有运气。如果我使用 oauthAcessToken 作为 "authToken" ,我会得到文件元数据而不是它的内容,它还会用 Permission denied 错误替换文件的内容。如果我使用 idToken 作为“authToken”,它会输出错误而不是元数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 2023-04-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多