Bry*_*ynJ 10 apache-flex base64 actionscript urlrequest http-authentication
我有一个Flex文件上传脚本,它使用URLRequest将文件上传到服务器.我想添加对http身份验证(服务器上受密码保护的目录)的支持,但我不知道如何实现这一点 - 我假设我需要以某种方式扩展类,但是如何让我有点迷失.
我试图修改以下内容(用URLRequest替换HTTPService),但这不起作用.
private function authAndSend(service:HTTPService):void{
var encoder:Base64Encoder = new Base64Encoder();
encoder.encode("someusername:somepassword");
service.headers = {Authorization:"Basic " + encoder.toString()};
service.send();
}
Run Code Online (Sandbox Code Playgroud)
我应该指出,在ActionScript/Flex方面我并不知情,尽管我已经设法成功地修改了上传脚本.
[编辑] - 根据下面的答案,这里是我的进度的更新,虽然我仍然无法让这个工作:
谢谢您的帮助.我试图实现你的代码,但我没有运气.
我在处理HTTP身份验证位置时遇到的一般行为是,IE7一切都很好,但在Firefox中,当我尝试将文件上传到服务器时,它会显示一个HTTP身份验证提示 - 即使给出了正确的详细信息,也只是停顿上传过程.
我相信IE7正常的原因在于浏览器和Flash组件共享的会话/身份验证信息 - 但是,在Firefox中并非如此,我遇到了上述行为.
这是我更新的上传功能,包含您的更改:
private function pergress():void
{
if (fileCollection.length == 0)
{
var urlString:String = "upload_process.php?folder="+folderId+"&type="+uploadType+"&feid="+formElementId+"&filetotal="+fileTotal;
if (ExternalInterface.available)
{
ExternalInterface.call("uploadComplete", urlString);
}
}
if (fileCollection.length > 0)
{
fileTotal++;
var urlRequest:URLRequest = new URLRequest("upload_file.php?folder="+folderId+"&type="+uploadType+"&feid="+formElementId+"&obfuscate="+obfuscateHash+"&sessidpass="+sessionPass);
urlRequest.method = URLRequestMethod.POST;
urlRequest.data = new URLVariables("name=Bryn+Jones");
var encoder:Base64Encoder = new Base64Encoder();
encoder.encode("testuser:testpass");
var credsHeader:URLRequestHeader = new URLRequestHeader("Authorization", "Basic " + encoder.toString());
urlRequest.requestHeaders.push(credsHeader);
file = FileReference(fileCollection.getItemAt(0));
file.addEventListener(Event.COMPLETE, completeHandler);
file.addEventListener(HTTPStatusEvent.HTTP_STATUS, onHTTPStatus);
file.addEventListener(ProgressEvent.PROGRESS, onUploadProgress);
file.upload(urlRequest);
}
}
Run Code Online (Sandbox Code Playgroud)
如上所述,无论是否修改我的功能,我似乎都会遇到相同的结果.
我还可以问一下crossdomain.xml应该位于何处 - 因为我目前没有,并且我不确定将它放在何处.
Chr*_*ato 19
URLRequest的语法略有不同,但想法是一样的:
private function doWork():void
{
var req:URLRequest = new URLRequest("http://yoursite.com/yourservice.ext");
req.method = URLRequestMethod.POST;
req.data = new URLVariables("name=John+Doe");
var encoder:Base64Encoder = new Base64Encoder();
encoder.encode("yourusername:yourpassword");
var credsHeader:URLRequestHeader = new URLRequestHeader("Authorization", "Basic " + encoder.toString());
req.requestHeaders.push(credsHeader);
var loader:URLLoader = new URLLoader();
loader.load(req);
}
Run Code Online (Sandbox Code Playgroud)
要记住以下几点:
最好我可以告诉,由于某种原因,这只适用于请求方法是POST的情况; 标头不会被GET请求设置.
有趣的是,除非至少有一个URLVariables名称 - 值对与请求打包在一起,否则它也会失败,如上所示.这就是为什么你在那里看到的许多例子(包括我的)附加了"name = John + Doe" - 它只是一个占位符,表示URLRequest在设置任何自定义HTTP头时似乎需要的一些数据.没有它,即使经过适当身份验证的POST请求也会失败.
显然,Flash播放器版本9.0.115.0完全阻止了所有授权标题(这里有关于此标题的更多信息),因此您可能也想要记住这一点.
您几乎肯定必须修改您的crossdomain.xml文件以容纳您将要发送的标头.在我的情况下,我正在使用它,这是一个相当开放的策略文件,因为它接受来自任何域,所以在你的情况下,你可能想要限制更多的东西,这取决于你的安全意识.
crossdomain.xml的:
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" />
<allow-http-request-headers-from domain="*" headers="Authorization" />
</cross-domain-policy>
Run Code Online (Sandbox Code Playgroud)
......这似乎有效; 在这一个更多的信息可从Adobe 这里).
上面的代码是使用Flash播放器10(带有调试和发布SWF)测试的,所以它应该适合你,但我想更新我原来的帖子,以包含所有这些额外的信息,以防你遇到任何问题,因为机会似乎(遗憾的是)你很可能.
希望能帮助到你!祝好运.我会留意评论.
| 归档时间: |
|
| 查看次数: |
34918 次 |
| 最近记录: |