File Reference.load()与预期不符

时间:2009-12-26 15:27:31

标签: flex actionscript-3 ria

我使用的是Flash Player 10和Flex SDK 3.4。代码如下:

// Following comes callbacks
function imageLoadOpenCallback(evt:Event):void
{
    trace("in--open");
}

function imageLoadCompleteCallback(evt:Event):void
{
    trace("in--load");
    var fr:FileReference = evt.target as FileReference;
    trace(fr.data);
}

function imageLoadErrorCallback(evt:IOErrorEvent):void
{
    trace("in--ioerror");
}

function imageSelectCancelCallback(evt:Event):void
{
    trace("in cancel");
}

function imageSelectCallback(evt:Event):void
{
    trace("in -- select");
    for (var i:int=0; i<frl.fileList.length; i++)
    {

        frl.fileList[i].addEventListener(Event.OPEN, imageLoadOpenCallback);
        frl.fileList[i].addEventListener(Event.COMPLETE, imageLoadCompleteCallback);
        frl.fileList[i].addEventListener(IOErrorEvent.IO_ERROR, imageLoadErrorCallback);
        frl.fileList[i].load();
        trace(frl.fileList[i]);
        trace(frl.fileList[i].creationDate);
        trace(frl.fileList[i].creator);
        trace(frl.fileList[i].data);
        trace(frl.fileList[i].name);
    }   
}


// Following comes UI handlers
function onAddPictures():void
{
    var imageFilter:FileFilter = new FileFilter("Images", "*.jpg;*.png");
    frl.addEventListener(Event.SELECT, imageSelectCallback);
    frl.addEventListener(Event.CANCEL, imageSelectCancelCallback);
    frl.browse([imageFilter]);
}

当我在对话框中选择一些文件时,只调用imageSelectCancelCallback处理程序。但是根本没有调用load / open / io_error处理程序。我有谷歌的一些代码示例,其中使用FileReference而不是FileReferenceList。我不知道原因,你能帮我吗?

3 个答案:

答案 0 :(得分:2)

在Air中,fileReference中的fileReferenceList个对象在执行fileList[i].load()时不会触发完整事件。在Flex项目中,它工作正常。 Adobe没有恰当地回应关于此的错误报告。

答案 1 :(得分:1)

确保在flex的编译器设置中,“使用特定版本”至少有10.0.0。

答案 2 :(得分:0)

如果您需要一次上传多个文件,则使用FileReferenceList代替FileReference的主要原因是。如果您只想允许一次上传一个文件,只需使用FileReference

当您在文件浏览器中选择某些文件并单击“确定”时,应调用imageSelectCallback()和NOT imageSelectCancelCallback()。只有在单击“取消”时才会调用imageSelectCancelCallback()

除此之外,我从未使用load() API,但我确实使用了upload(URLRequest) API。我不确定您的用例是什么,但如果您需要将图像上传到服务器,则应使用upload()方法。

说到上传事件,我在收听Event.COMPLETE事件时遇到了一些可靠性问题,所以实际上听取DataEvent.UPLOAD_COMPLETE_DATA会有更好的结果。