urlrequest或Loader根本不在某些计算机上工作?
-
30-09-2019 - |
题
因此,我的问题可能比这大一点,但我不确定。我正在为客户端创建一个自定义的闪存照片查看器,该客户端将图像用加载程序对象动态加载。它在服务器上指定的目录中使用一个文件夹名称,并调用PHP页面(使用urlrequest)以获取文件夹的可行内容。然后将其从该数组加载。
这是一个问题:它在我的机器和我测试过的每台机器上都可以正常工作,但是它在我的客户的机器或他的某些客户的机器上不起作用。屏幕底部的装载机条没有开始填充,这意味着图像没有开始加载,并且状态栏表示它继续等待服务器,但永远无法完成等待。这在一台计算机上是一致的,但是各种机器各不相同。
我添加了诊断(我为跟踪某些VAR并收集错误的自定义类)来捕获任何错误,但它在我客户的计算机上没有任何报告。我添加了Flash版本检查代码,因此较低版本弄乱它的可能性已经消失了...
我想我的问题是,我本来可以忽略的任何东西(安全,环境等)是否允许请求对象或某些机器上使用的东西?我一直在撕开头发,试图解决这个问题!
我的代码(相关部分):
public static const LOADLIMIT:int = 4;
public var paramObj:Object;
private var imageRequests:Vector.<URLRequest>;
private var loaderObj:Vector.<Loader>;
private var nextToLoad:int = -1;
//...
public function Player(){
//...
paramObj = loaderInfo.parameters;
if (!paramObj.root) paramObj.root = "http://site.com/images/";
paramObj.imgloc = paramObj.imgloc;
var res = bootstrapImages(paramObj.imgloc);
if (res is String){
loadErrorMsg.text = res;
loadErrorMsg.visible = true;
log.log(res);
}
//...
}
private function bootstrapImages(imgloc:String):*{
try{
if (!imgloc) return "No image location specified";
var req:URLRequest = new URLRequest(paramObj.root+"getdirlist.php?name="+imgloc);
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, directoryLoaded);
loader.addEventListener(IOErrorEvent.IO_ERROR, function(ex:IOError){
loadErrorMsg.text = "Error retreiving album data.";
loadErrorMsg.visible = true;
log.log(ex);
});
loader.load(req);
} catch (ex:Error){
log.log(ex); throw ex;
}
}
private function directoryLoaded(e:Event){
try{
//directory will come down as a json array
trace(e.target.data);
try {
var items:Array = JSON.decode(e.target.data);
} catch (ex:Error){
trace (ex.getStackTrace());
loadErrorMsg.text = "Error parsing album data.";
loadErrorMsg.visible = true;
log.log(ex);
return;
}
if (items.length == 0){
loadErrorMsg.text = "Invalid album name";
loadErrorMsg.visible = true;
log.log("Items length is 0.");
return;
}
imageRequests = new Vector.<URLRequest>();
loaderObj = new Vector.<Loader>();
for each(var item:String in items){
imageRequests.push(new URLRequest(paramObj.root+"coffeeimages/"+paramObj.imgloc+"/"+item));
loaderObj.push(null);
}
//...show UI...
for (var i:int = 0; i < LOADLIMIT; i++){
imageLoaded(null);
}
} catch (ex:Error){
log.log(ex); throw ex;
}
}
private function imageLoaded(e:Event){
try{
//if this was called as a result of the load event, start the slideshow! :D
if (e != null && e.target != null) {
//stage.addChild((e.target as LoaderInfo).loader);
trace(loaderObj[0]);
if (loaderObj[0] != null && //if the first image is loaded
loaderObj[0].contentLoaderInfo.bytesLoaded >= loaderObj[0].contentLoaderInfo.bytesTotal){
trace(loaderObj[0].contentLoaderInfo.bytesLoaded, loaderObj[0].contentLoaderInfo.bytesTotal);
loadErrorMsg.visible = false;
playSlideshow(true);
}
}
trace((e)?e.target:null, loaderObj);
nextToLoad++;
if (nextToLoad >= imageRequests.length) return;
var r:URLRequest = imageRequests[nextToLoad];
var l:Loader = new Loader();
l.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded);
l.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function(ex:ErrorEvent){
loadErrorMsg.text = "Error parsing image data.";
loadErrorMsg.visible = true;
log.log(ex);
});
l.load(r);
loaderObj[nextToLoad] = l;
log.addObjectWatch(l);
} catch (ex:Error){
log.log(ex); throw ex;
}
}
还, 这是网站上的播放器直播. 。 Ctrl+Alt+Home提出了我的诊断面板。请告诉我,它是否也对您不起作用,所以我可以更担心这个...:/谢谢。
编辑: 我添加了更多调试信息。事实证明,在无法加载它的计算机上,当尝试引导专辑信息时,他们将获得HTTP状态0。我不知道这意味着什么...
解决方案
因此,问题是URL要求的问题...
我的客户正在键入“ www.site.com”,而我的代码要求“ site.com”。对于Adobe,这是一个跨站点请求,并且 不允许 默认情况下。一个解决方案(可能是最简单的解决方案)是将一个名为“ CrossDomain.xml”的文件添加到网站的根文件夹中。提出请求时,Flash查找此文件。对我有用的一个例子如下:
//crossdomain.xml
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*.site.com" secure="false"/>
</cross-domain-policy>
其他解决方案涉及重定向到两个(“ site.com”重定向到“ www.site.com”),或进行URL重写或获取输入的URL。
其他提示
我注意到的几件事,您只是在听event.complete和ioerrorevent.io_error。我还建议您听httpstatusevent.http_status,event.open,尽管我还没有添加这些内容,但如果您仍然没有到任何地方,它们可能会提供有用的信息。
如果您仅加载图像而不访问其内容,则不需要LoaderContext对象,因此(安全)实际上不应该是问题。您绝对应该在Imageloded中分离逻辑,以便既不是启动器和装载机的完成处理程序。
无论如何,没有任何线索是否对您有用,但是我使您的代码更具可读性并重新设计了一些意义上的东西。
public static const LOADLIMIT:int = 4;
private var paramObj:Object;
private var imageRequests:Vector.<URLRequest>;
private var loaderObj:Vector.<Loader>;
private var nextToLoad:int = -1;
public function Player(){
paramObj = loaderInfo.parameters;
//what is this all about, your backup URL is useless?
if (!paramObj.root) {
paramObj.root = "http://site.com/images/";
}
var res = bootstrapImages();
if (res.length > 0){
loadErrorMsg.text = res;
loadErrorMsg.visible = true;
//log.log kills me
log.log(res);
}
}
private function bootstrapImages():String {
try {
var req:URLRequest = new URLRequest(paramObj.root + "getdirlist.php?name=" + paramObj.imgloc);
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, directoryLoaded);
loader.addEventListener(IOErrorEvent.IO_ERROR, dataIOError);
loader.load(req);
} catch (ex:Error) {
log.log(ex);
}
return "";
}
private function directoryLoaded(e:Event):void{
trace(e.target.data);
try {
var items:Array = JSON.decode(e.target.data);
} catch (ex:Error){
trace (ex.getStackTrace());
loadErrorMsg.text = "Error parsing album data.";
loadErrorMsg.visible = true;
log.log(ex);
return;
}
if (items.length == 0){
loadErrorMsg.text = "Invalid album name";
loadErrorMsg.visible = true;
log.log("Items length is 0.");
return;
}
imageRequests = new Vector.<URLRequest>();
loaderObj = new Vector.<Loader>();
for each(var item:String in items){
imageRequests.push(new URLRequest(paramObj.root+"coffeeimages/"+paramObj.imgloc+"/"+item));
loaderObj.push(new Loader());
}
for (var i:int = 0; i < LOADLIMIT; i++){
loadNextImage();
}
}
private function loadNextImage():void {
nextToLoad++;
if (nextToLoad < imageRequests.length) {
loaderObj[nextToLoad].contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded);
loaderObj[nextToLoad].contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, dataIOError);
try {
loaderObj[nextToLoad].load(imageRequests[nextToLoad]);
}
catch (e:Error) {
log.log(ex);
}
log.addObjectWatch(loaderObj[nextToLoad]);
}
}
private function dataIOError(e:IOError):void {
loadErrorMsg.text = "IOError: " + e.errorID + " - " + e.name + ", " + e.message;
loadErrorMsg.visible = true;
log.log(ex);
}
private function imageLoaded(e:Event){
//Start the slideshow if the first image has loaded
loadNextImage();
if (e.target == loaderObj[0]) {
trace(loaderObj[0].contentLoaderInfo.bytesLoaded, loaderObj[0].contentLoaderInfo.bytesTotal);
loadErrorMsg.visible = false;
playSlideshow(true);
}
}
编辑: 您可能只想完全废除加载代码,而是使用 散装装载机
我喜欢上面提到的crossdomain.xml解决方案,但是我们在客户端PC上也有类似的问题。问题是Adblocker浏览器插件正在阻止ActionScript的Urlrequest。我们目前正在找到解决方案。