我使用的是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。我不知道原因,你能帮我吗?
答案 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
会有更好的结果。