AS3 将多个文本框数据保存并加载到本地文件

Posted

技术标签:

【中文标题】AS3 将多个文本框数据保存并加载到本地文件【英文标题】:AS3 Save & Load multiple text boxs data to local file(s) 【发布时间】:2015-05-18 15:50:33 【问题描述】:

我正在尝试在 Flash (AS3) 中创建一个表单,该表单可以将多个动态文本框中的数据/文本保存到用户指定的路径和本地文件中,并将任何保存的表单加载回适当的文本框中。我找到了一些关于如何使用单个文本框执行此操作的很好的示例。我知道它应该很简单,但是我似乎无法弄清楚或成功修改现有示例以使用多个文本框?有任何想法吗?

这是我目前正在使用/尝试修改的代码。

package 

import flash.display.Sprite;
import flash.display.Stage;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.IOErrorEvent;
import flash.net.FileFilter;
import flash.net.FileReference;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFieldType;
import flash.text.TextFormat;
import flash.utils.ByteArray;
import flash.xml.XMLDocument;

public class BinaryXMLTool extends Sprite 


    // ** minimalist buttons **
    private var browseButton:TextField;
    private var saveButton:TextField;

    // ** minimalist editor **
    private var xmlText:TextField;

    // ** browse/load/save **
    private var xmlFile:FileReference;

    public function BinaryXMLTool():void 
    
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);
    

    private function init(e:Event = null):void 
    
        removeEventListener(Event.ADDED_TO_STAGE, init);

        // entry point
        stage.align         = StageAlign.LEFT;
        stage.scaleMode         = StageScaleMode.NO_SCALE;
        stage.showDefaultContextMenu    = false;

        // ** draw minimalist text editor **
        xmlText             = new TextField();
        xmlText.multiline       = true;
        xmlText.background      = true;
        xmlText.backgroundColor     = 0xEEEEEE;
        xmlText.type            = TextFieldType.INPUT;
        xmlText.width           = 400;
        xmlText.height          = 400;
        xmlText.border          = true;
        xmlText.x           = 15;
        addChild(xmlText);

        // ** draw minimalist browse button **
        browseButton            = new TextField();
        browseButton.autoSize       = TextFieldAutoSize.LEFT;
        browseButton.background     = true;
        browseButton.backgroundColor    = 0x000000;
        browseButton.defaultTextFormat  = new TextFormat("Tahoma", 14, 0xFFFFFF, true, null, null, null, null, null, 4, 4);
        browseButton.selectable     = false;
        browseButton.text       = "BROWSE";
        browseButton.x          = (stage.stageWidth - browseButton.width) * 0.5;
        browseButton.y          = 420;
        addChild(browseButton);

        // ** draw minimalist save button **
        saveButton          = new TextField();
        saveButton.autoSize     = TextFieldAutoSize.LEFT;
        saveButton.background       = true;
        saveButton.backgroundColor  = 0xAAAAAA;
        saveButton.defaultTextFormat    = browseButton.defaultTextFormat;
        saveButton.selectable       = false;
        saveButton.text         = "SAVE";
        saveButton.x            = (stage.stageWidth - saveButton.width) * 0.5;
        saveButton.y            = 460;
        addChild(saveButton);

        // ** button listeners **
        browseButton.addEventListener(MouseEvent.CLICK, on_buttonClick,     false, 0, true);
        saveButton.addEventListener(MouseEvent.CLICK, on_buttonClick, false, 0, true);
    

    /**
    * handle browse or save
    */
    private function on_buttonClick(evt:MouseEvent):void
    
        var btn:TextField = evt.target as TextField;
        if (btn)
        
            if (btn.text == "BROWSE")
            
                xmlFile = new FileReference();
                xmlFile.addEventListener(Event.SELECT, on_xmlSelect, false, 0, true);
                xmlFile.browse([new FileFilter("XML Documents","*.xml")]);
            
            else if (btn.text == "SAVE")
            
                if (xmlFile)
                
                    if (xmlText.text.length)
                    
                        // ** saving as binary **
                        var data:ByteArray = new ByteArray();
                        data.writeUTFBytes(xmlText.text);
                        data.compress();
                        new FileReference().save(data, "bin" + xmlFile.name);
                    
                
            
        

    

    /**
    * handle browse, load XML file
    */
    private function on_xmlSelect(evt:Event):void
    
        xmlFile.removeEventListener(Event.SELECT, on_xmlSelect);
        xmlFile.addEventListener(Event.COMPLETE, on_xmlComplete, false, 0, true);
        xmlFile.load();
    

    /**
    * handle load, check if it is binary, uncompress, display XML in editor
    */
    private function on_xmlComplete(evt:Event):void
    
        xmlFile.removeEventListener(Event.COMPLETE, on_xmlComplete);

        saveButton.backgroundColor = 0x000000;

        var data:* = FileReference(evt.target).data;
        if (data is ByteArray)
        
            try
            
                ByteArray(data).uncompress();
            
            catch(e:Error)
            
            

        
        data = XML(data);
        xmlText.text = data;
    
   

【问题讨论】:

它也适用于本地办公环境,所以不幸的是 php 不是一个选项。 好的,您找到的示例将单个 XML 字符串作为 zlib 压缩字节保存到文件中。在您的情况下,您希望将“多个文本”值保存到文件中;关心什么文件格式?您可以将其保存为纯 XML、AMF(ActionScript 消息格式)或其他格式。 我不介意它保存为哪种文件格式。 让您对我正在尝试创建的内容有更多的了解。我需要我们内部使用的客户详细信息/注册表单的数字版本。字段包括公司名称、联系人姓名、电话、手机、传真、电子邮件、Web 等,有点像地址簿应用程序。 Flash App 将加载我们现有 FORM 的 A4 大小/纵横比 JPG,并在页面上的适当位置创建 35 个或更多文本框。需要能够填充自己保存所述数据并将所述数据加载回适当的文本框中。 有道理。我发布了一个将多个文本字段值存储到 XML 文件的示例。 【参考方案1】:

使用 Flash Player,您可以使用 FileReference/save()load() 保存和加载本地文件。但是,这需要用户选择文件位置,而您无法控制它。

或者,您可以使用SharedObject 在本地存储数据。这可能需要用户许可,并且可能由用户(有意或无意)清除,例如通过浏览器的“清除本地数据”功能。

使用 AIR,您可以使用 File 类在无需任何用户交互的情况下读取和写入本地文件,也可以使用 EncryptedLocalStore

(这个问题被问了很多,如果你搜索一下你会发现更多信息。)

编辑:

查看您发布的示例代码,它期望将 XML 字符串作为 zlib 压缩字节写入文件。在您的情况下,您希望将多个值保存到一个文件中。您可以通过简单地构造一个包含这些值的新 XML 对象,然后从 XML 对象中读回这些值来做到这一点。这是一个执行此操作的示例:

// Timeline instances
var textField1:TextField;
var textField2:TextField;
var saveBtn:SimpleButton;
var loadBtn:SimpleButton;

saveBtn.addEventListener(MouseEvent.CLICK, saveClick);
function saveClick(e:MouseEvent):void 
    // Save the state of both text fields
    save(textField1.text, textField2.text, "data.xml");


loadBtn.addEventListener(MouseEvent.CLICK, loadClick);
function loadClick(e:MouseEvent):void 
    load();


function save(text1:String, text2:String, defaultFileName:String):void 
    var xml:XML = <xml>
        <text1>text1</text1>
        <text2>text2</text2>
    </xml>;
    var file:FileReference = new FileReference();
    file.save(xml, defaultFileName);


function load():void 
    var file:FileReference = new FileReference();
    file.browse([new FileFilter("XML", "*.xml")]);
    file.addEventListener(Event.SELECT, loadSelect);


function loadSelect(e:Event):void 
    var file:FileReference = e.target as FileReference;
    file.addEventListener(Event.COMPLETE, loadComplete);
    file.load();


function loadComplete(e:Event):void 
    var file:FileReference = e.target as FileReference;
    var xml:XML = XML(file.data.readUTFBytes(file.data.bytesAvailable));

    // Assign the loaded XML text values back to the text fields
    textField1.text = xml.text1;
    textField2.text = xml.text2;

【讨论】:

嗨亚伦,感谢您的快速响应。出于备份原因以及我们将保存多个表单以供以后编辑和/或打印的事实,SharedObject 不是一个选项。我一直在研究 FileRefrence/save() 和 load() 并发现了一段非常方便的代码,但是我需要将多个文本框保存到一个文件中,并且更愿意使用我物理创建的文本框而不是代码创建动态文本输入。 (我将使用我正在使用/需要修改的代码更新我的问题) 是的,您可以将 FileReference 与时间线创建的文本字段一起使用。当你发布它时,我会检查你的代码。 太棒了!,这正是我想要的,而且比我试图实现它的方式简单得多。非常感谢 Aaron,你是个传奇人物。

以上是关于AS3 将多个文本框数据保存并加载到本地文件的主要内容,如果未能解决你的问题,请参考以下文章

Jquery Ajax 将数据发布到本地文件

将文本区域保存到本地服务器上的 HTML 文件

无法将数据框保存到本地 Mac 机器

java 从数据库取出数据并保存到本地文本中

将数据框保存到本地文件系统会导致空结果

将数据从 .txt 保存并加载到正确的 texbox