0

场景:

我有一个 Flash 网站(这里),它通过 Wordpress 的 RSS(我添加了一个插件以在 RSS 中包含页面)从一个 wordpress 站点(这里)导入它的一些内容。我知道这不是一个绝妙的主意,但是由于一长串我不会深入讨论的原因,这是我一直坚持的设置:/

问题:

导入 RSS 提要(它在运行时下载到 SWF 并像 XML 一样读取)时,我无法获取文件大小。这意味着预加载器不准确(我只是手动猜测了一个现在可以使用的数字,显然会随着时间的推移而增长)。我如何获得这个文件大小?

我知道服务器上可能存在某些压缩提要/文件(GZip 等)的设置,但我对 wordpress 架构非常不熟悉,尽管我尽了最大努力,但我还是找不到应用此设置的位置。

这是预加载器更新代码。113*1024 是我想要放置 rss_loader.bytesTotal (WordPress 内容的加载器)的位置,但是当我执行 rss_loader.bytesTotal 时返回为 0:

function update_loading(e:Event):void
{
    var total:Number = stage.loaderInfo.bytesTotal + (113 * 1024) + css_loader.bytesTotal;
    var loaded:Number = stage.loaderInfo.bytesLoaded + rss_loader.bytesLoaded + css_loader.bytesLoaded;
    if (total == loaded)
    {
        updatePicture(360);
        loading_mc.perc.text = "100%";
        removeEventListener(Event.ENTER_FRAME,update_loading);
        nextFrame();
    }
    else
    {
        var deg:Number = (loaded / total) * 360;
        updatePicture(deg);
        loading_mc.perc.text = String(int((loaded / total) * 100))+"%";
    }
}

这是 RSS 导入代码,虽然我不认为它非常相关:

var rss_xml:XML = new XML();
var post_xml:XML = new XML();
var page_xml:XML = new XML();
var rss_loader:URLLoader;
rss_loader = new URLLoader(new URLRequest("http://news.sulsc.org/feed"));
function rss_loaded(e:Event):void
{
    rss_xml = XML(e.target.data);
    var rss_raw:String = String(rss_xml);
    rss_raw = rss_raw.split(":encoded").join("");
    rss_raw = rss_raw.split("\n").join("");
    rss_raw = rss_raw.split('<p style="text-align: right;">').join('<p class="right">');
    rss_raw = rss_raw.split('<p style="text-align: center;">').join('<p class="centre">');
    rss_raw = rss_raw.split('<p style="text-align: left;">').join('<p class="left">');
    rss_raw = rss_raw.split('<p style="text-align: justify;">').join('<p class="just">');
    var heading_replace:RegExp = new RegExp("(</h[0-9]>)(<h[0-9]>)","g9");
    var underline_replace:RegExp = new RegExp('<span style="text-decoration: underline;">(.*?)</span>',"gi");
    var bold_replace:RegExp = new RegExp('<strong>(.*?)</strong>',"gi");
    var italic_replace:RegExp = new RegExp('<em>(.*?)</em>',"gi");
    rss_raw = rss_raw.replace(heading_replace,'$1<p class="space"></p>$2');
    rss_raw = rss_raw.replace(underline_replace,'<u>$1</u>');
    rss_raw = rss_raw.replace(bold_replace,'<b>$1</b>');
    rss_raw = rss_raw.replace(italic_replace,'<i>$1</i>');

    var page_test:RegExp = new RegExp("http://(news.|www.|)sulsc\\.org/(|wordpress/)\\?page_id=[0-9]+","gi");
    page_xml = XML(rss_raw);
    post_xml = XML(rss_raw);
    rss_xml = null;
    for (var i:uint; i<post_xml.channel.item.length(); i++)
    {
        if (page_test.test(post_xml.channel.item[i]) == true)
        {
            post_xml.channel.item[i] = "";
            i--;
        }
        if (i == post_xml.channel.item.length()-1)
        {
            rss_loader.bytesLoaded = 113 * 1024;
        }
    }
}
4

1 回答 1

0

去年我在一个项目中遇到了类似的问题。事实证明,服务器没有返回正确的标头以供 Flash 继续使用。不幸的是,我不记得它需要填充哪个标题bytesTotal,但我确实想出了一个快速的解决方法。

this.urlLoader.addEventListenever( HTTPStatusEvent.HTTP_RESPONSE_STATUS, this.statusResponse );

private function statusResponse(e:HTTPStatusEvent = null):void{
    for ( var i:Number = 0; i < e.responseHeaders.length; i++ ) {
        var current:Object = e.responseHeaders[i];
        if ( current.name.toLowerCase() == "content-length" ) {
            this.bytesTotal = current.value;
            break;
        }
    }
}

这对我有用,尽管它显然依赖于服务器发送Content-Length标头。

于 2013-05-17T21:29:10.697 回答