我正在为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
答案 0 :(得分:0)
答案 1 :(得分:0)
您没有在您的通话中添加授权标头,而且必须是POST ...添加此内容:
var header:URLRequestHeader = new URLRequestHeader("Authorization", "Bearer "+authToken);
...
request.method = URLRequestMethod.POST;
request.requestHeaders.push(header);