• (转)百度文库浏览器分析及实现(续)


    这个是DotNet动态模拟的实现页面:http://download.csdn.net/source/2153964

    文库系统已经开发完成了,包括上传,动态转换,以及符合百度文库的资源文件的生成,打分,统计,收藏等功能

    (由于项目的关系不能公开项目代码,当前示例,仅包含显示,不包含数据库,上传,动态转换,资源文件生成等内容)

    这里就简单的介绍一下整个流程及原理。

    首先,反编译 百度文库Flash浏览器用的软件是Sothink SWF Decompiler,不过你会发现反编译的代码还是有很多错误的;当然您可以逐步将代码进行修改,以达到使用的需要(这里我仅仅是使用这个Flash本身,采用反编译器仅为分析文库资源文件格式)。

    其次,需要通过Flash的代码分析百度文库动态装载的资源文件的文件格式 ,在文件DocViewer.as中事件响应函数binaryLoadComplete中,仔细读这一段您就可以分析清楚百度文库的资源文件格式了,这里我就不完整的叙述了。

    view plaincopy to clipboardprint?
    private function binaryLoadComplete(event:Event = null) : void 
    {  
        var _loc_11:ByteArray = null;  
        var _loc_12:int = 0;  
        trace("binaryLoadComplete...");  
        if (this._noDoc)  
        {  
            if (this._noDoc.parent)  
            {  
                this._noDoc.parent.removeChild(this._noDoc);  
            }  
            this._noDoc = null;  
        }  
        this._loadPercent = 0;  
        var _loc_2:* = URLLoader(event.target);  
        var _loc_3:* = _loc_2.data;  
        this._byteArray = [];  
        var _loc_4:Array = [];  
        var _loc_5:int = 0;  
        var _loc_6:* = _loc_3.length;  
        while (_loc_5 < _loc_6)  
        {  
            if (_loc_5 + 3 < _loc_6)  
            {  
                if ((_loc_3[_loc_5] == 67 || _loc_3[_loc_5] == 70) && _loc_3[(_loc_5 + 1)] == 87 && _loc_3[_loc_5 + 2] == 83 && (_loc_3[_loc_5 + 3] == 9 || _loc_3[_loc_5 + 3] == 10))  
                {  
                    _loc_4.push(_loc_5);  
                }  
            }  
            else 
            {  
                _loc_4.push(_loc_6);  
                break;  
            }  
            _loc_5++;  
        }  
        var _loc_7:* = _loc_3.readMultiByte(_loc_4[0], "utf-8");  
        trace(_loc_7);  
        var _loc_8:* = JSON.decode(_loc_7);  
        this._pagesAll = Number(_loc_8["totalPage"]);  
        if (!this._pagesLoaded)  
        {  
            this._pagesLoaded = 0;  
        }  
        this._pagesLoaded = this._pagesLoaded + (Number(_loc_8["toPage"]) - Number(_loc_8["fromPage"]) + 1);  
        this._fromPage = Number(_loc_8["fromPage"]);  
        this._toPage = Number(_loc_8["toPage"]);  
        trace("pagesall:" + this._pagesAll + " , frompage:" + this._fromPage + " , topage:" + this._toPage);  
        this._pagethLoading = Number(_loc_8["fromPage"]) - 1;  
        var _loc_9:int = 0;  
        var _loc_10:* = _loc_4.length - 1;  
        while (_loc_9 < _loc_10)  
        {  
            _loc_11 = new ByteArray();  
            _loc_12 = _loc_4[(_loc_9 + 1)] - _loc_4[_loc_9];  
            _loc_3.readBytes(_loc_11, 0, _loc_12);  
            this._byteArray.push(_loc_11);  
            _loc_9++;  
        }  
        trace("...............这一次加载了多少页:" + this._byteArray.length);  
        this._hasConvertPages = 0;  
        this._allConvertPages = Math.min(this._byteArray.length, this._toPage - this._fromPage + 1);  
        if (this._allConvertPages > 0)  
        {  
            this.byteArr2DisplayObj(this._hasConvertPages);  
        }  
        else 
        {  
            trace("blank document ...");  
            this.processNoDoc();  
            this._loadPercent = 0;  
            dispatchEvent(new Event("STOP_LOADING", true));  
            this._inLoading = false;  
        }  
        return;  
    }// end function 
            private function binaryLoadComplete(event:Event = null) : void
            {
                var _loc_11:ByteArray = null;
                var _loc_12:int = 0;
                trace("binaryLoadComplete...");
                if (this._noDoc)
                {
                    if (this._noDoc.parent)
                    {
                        this._noDoc.parent.removeChild(this._noDoc);
                    }
                    this._noDoc = null;
                }
                this._loadPercent = 0;
                var _loc_2:* = URLLoader(event.target);
                var _loc_3:* = _loc_2.data;
                this._byteArray = [];
                var _loc_4:Array = [];
                var _loc_5:int = 0;
                var _loc_6:* = _loc_3.length;
                while (_loc_5 < _loc_6)
                {
                    if (_loc_5 + 3 < _loc_6)
                    {
                        if ((_loc_3[_loc_5] == 67 || _loc_3[_loc_5] == 70) && _loc_3[(_loc_5 + 1)] == 87 && _loc_3[_loc_5 + 2] == 83 && (_loc_3[_loc_5 + 3] == 9 || _loc_3[_loc_5 + 3] == 10))
                        {
                            _loc_4.push(_loc_5);
                        }
                    }
                    else
                    {
                        _loc_4.push(_loc_6);
                        break;
                    }
                    _loc_5++;
                }
                var _loc_7:* = _loc_3.readMultiByte(_loc_4[0], "utf-8");
                trace(_loc_7);
                var _loc_8:* = JSON.decode(_loc_7);
                this._pagesAll = Number(_loc_8["totalPage"]);
                if (!this._pagesLoaded)
                {
                    this._pagesLoaded = 0;
                }
                this._pagesLoaded = this._pagesLoaded + (Number(_loc_8["toPage"]) - Number(_loc_8["fromPage"]) + 1);
                this._fromPage = Number(_loc_8["fromPage"]);
                this._toPage = Number(_loc_8["toPage"]);
                trace("pagesall:" + this._pagesAll + " , frompage:" + this._fromPage + " , topage:" + this._toPage);
                this._pagethLoading = Number(_loc_8["fromPage"]) - 1;
                var _loc_9:int = 0;
                var _loc_10:* = _loc_4.length - 1;
                while (_loc_9 < _loc_10)
                {
                    _loc_11 = new ByteArray();
                    _loc_12 = _loc_4[(_loc_9 + 1)] - _loc_4[_loc_9];
                    _loc_3.readBytes(_loc_11, 0, _loc_12);
                    this._byteArray.push(_loc_11);
                    _loc_9++;
                }
                trace("...............这一次加载了多少页:" + this._byteArray.length);
                this._hasConvertPages = 0;
                this._allConvertPages = Math.min(this._byteArray.length, this._toPage - this._fromPage + 1);
                if (this._allConvertPages > 0)
                {
                    this.byteArr2DisplayObj(this._hasConvertPages);
                }
                else
                {
                    trace("blank document ...");
                    this.processNoDoc();
                    this._loadPercent = 0;
                    dispatchEvent(new Event("STOP_LOADING", true));
                    this._inLoading = false;
                }
                return;
            }// end function

    到目前知道了百度的资源文件格式,也能实现文件的动态显示,接下来就是需要实现文档的上传以及转换等操作

    上传 ,可以用百度默认的上传flash,也可以使用第三方的上传flash,这里有很多通用的flash上传控件,只是在dotnet中接收大文件时需要修改iis的相关配置。

    上传到服务器后,首先采用数据库记录上传的文件以及关联用户(或许这里面您需要为文库建立 模型 了)

    接下来需要进行的处理就是将任意文档转换为PDF ,这里面可以使用的有国外免费使用的PDF Convert 虚拟打印机,当然也有付费版本的

    根据系统的情况确定是自动转换为PDF,还是需要人工审核 ,百度采用的是人工审核的方式

    之后需要做的事情就是将PDF转换为FlashPaper ,这里面需要您认真领会上面一段代码,然后将文档组织成为百度文库Flash支持的文档格式,暂时称为SWFX吧,关于这个文件格式的描述,在一段时间后我将公开他

    最后需要做的事情就是将转换的SWFX存储,结合后来装载资源文件的规则进行命名及存储

    所有的核心步骤就是这样的,不过这里面有一个问题就是虚拟打印机的效率还是很低的,PDF转换为FlashPaper的转换效率也是马马虎虎,可以考虑将这两项工作交由windows服务 来实现

    也就是说需要使用C#开发一个windows服务来对审核通过的文档进行两次转换工作。

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chinull/archive/2010/04/19/5503397.aspx

  • 相关阅读:
    Random生成随机数
    Jmeter(八)Jmeter监控tomcat
    Jmeter(七)Mongodb的增删改查
    Jmeter(六)文件上传和下载文件
    Jmeter(五)mysql的增删改查
    Jmeter(四)测试webservice脚本
    Jmeter(三)断言和关联
    Jmeter(二)参数化
    Jmeter(一)http接口添加header和cookie
    Python学习笔记(一)数据类型
  • 原文地址:https://www.cnblogs.com/cwfsoft/p/1728152.html
Copyright © 2020-2023  润新知