【发布时间】: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