如何从Firebase存储下载XML文件?

时间:2016-10-19 05:08:02

标签: actionscript-3 air firebase-storage

我正在为AIR Android开发个人项目。我正在使用REST API和Action Script 3.0。我已成功实现身份验证,上传和删除文件,但我无法下载文件。我只有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);
    }

首先我只是尝试过     的navigateToUrl(); 但这似乎没有用,所以我尝试使用:

URLLoader();

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

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

navigateToURL()在浏览器中显示相同的错误。 URLLoader在输出窗口中显示相同的错误。这也会使用错误替换xml文件的内容 - 存储在Firebase存储上的文件。我试过重新检查代码。在输出窗口中成功跟踪文件的元数据。我检查了我的规则。规则没有问题。我已经在这方面工作了大约一个星期,但仍然没有能够知道最新情况。任何帮助都将受到高度赞赏。

在进一步测试中,我发现了下载网址中的下载令牌"来自Firebase Stoage和来自request.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显示上述错误并用此替换xml内容。     https://firebasestorage.googleapis.com/v0/b/spesa-febea.appspot.com/o/data%2FUbgGtcJrt1MOV5ClC1LAEt2sLou1%2FDatabase?alt=media&token=6025eb7a-4453-4714-9150-4f3aec239615

2 个答案:

答案 0 :(得分:0)

  1. 如果您需要浏览器中的开放数据,请使用 navigateToURL( rq ,或者如果您想在应用中获取数据< / strong>然后使用[ URLLoader ]。load()
    1. 请查看 URLLoaderDataFormat (二进制|文本|变量),XML最好是文本。
    2. 阅读: URLRequestDefaults (如果您需要使用缓存或需要关注重定向)
    3. 请记住错误HTTP 403 Forbidden 可能需要重定向您的请求而不是创建新的(可能是您在更改中丢失了令牌授权)

答案 1 :(得分:0)

您没有在您的通话中添加授权标头,而且必须是POST ...添加此内容:

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

...

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