【问题标题】:Cannot get file data from the clipboard using Flex无法使用 Flex 从剪贴板获取文件数据
【发布时间】:2009-02-12 18:27:49
【问题描述】:

给定:具有以下事件的 Flex TileList:

<mx:nativeDragDrop>
  <![CDATA[
    if(event.clipboard.hasFormat(ClipboardFormats.FILE_LIST_FORMAT)) {
      var files:Array = event.clipboard.getData(ClipboardFormats.FILE_LIST_FORMAT) as Array;

      for each(var file:File in files)
      {
        // file.data is null here!
      }

      this.listData.refresh();
    }
  ]]>
</mx:nativeDragDrop>

我正在尝试从拖动到此 TileList 的 jpeg 创建一个缩略图列表。 Image.source 可以使用 url 来显示图像,但我需要先缩小图像(嗨 rez 照片)我已经完成了缩放部分,除了我需要文件中的 BitmapData 并且它对于 file.data 具有空值。

另外,我试过这个:

var x:URLRequest = new URLRequest(value.file.url); // this is a local file (e.g. file:///C:/somefile.jpg)
var b:Bitmap = new Bitmap(x.data as BitmapData);

数据也为空!太令人沮丧了。任何帮助将不胜感激。

【问题讨论】:

    标签: apache-flex file drag-and-drop air clipboard


    【解决方案1】:

    我假设这是 AIR 应用程序的一部分。 (无法从普通的 Flex 应用程序访问剪贴板。)

    我没有使用 AIR 的经验,但是您的第二个代码块显然是错误的。 URLRequest 实例本身什么也不做,它只是一个存储请求详细信息的静态对象。为了从该 URL 获取数据,您需要创建一个 Loader,并将请求传递给该加载器,如下所示:

    var req:URLRequest = new URLRequest(value.file.url); // this is a local file (e.g. file:///C:/somefile.jpg)
    var ldr:Loader = new Loader();
    ldr.addEventListener(Event.COMPLETE, function(event:Event):void {
       var b:Bitmap = event.target.content as Bitmap;
    });
    ldr.load(req);
    

    当然,您必须填写Event.COMPLETE 处理程序。请注意,Loader 类可用于加载 SWF 和图像对象,对于所有其他内容,您必须使用 URLLoader 并自己解析数据。

    关于nativeDragDrop 块,这是来自documentation 的sn-p:

    通常是一个处理程序 nativeDragEnter 或 nativeDragOver 事件评估数据正在 拖动,以及拖动动作 允许,以确定是否 交互式对象可以接受放置。 指定一个交互式对象 是一个合格的目标,事件 处理程序必须调用 NativeDragManager.acceptDrop() 函数,传入一个引用 物体。如果用户释放 鼠标按钮在指定 对象,对象成为水滴 目标并派遣 nativeDragDrop 事件。

    你打电话给NativeDragManager.acceptDrop() 正确吗?

    【讨论】:

    • 我的 drg/drp 功能没有问题。这是我无法通过访问文件从文件中获取数据的事实。感谢 URLRequest 提示。在我发布这个之后,我也尝试了: var x:File = new File(value.file.url); // x.data 仍然为空!在这种情况下我也可以使用 Loader 类吗?
    • 好吧,这真的归结为这一点。打开文件工作。我可以查看有关文件的信息。然而,这仍然是打破: var x:File = new File(value.file.nativePath); x.load(); var b:Bitmap = x.data 作为位图; // x.data 仍然为空!
    • 就像我说的,我不是 AIR 程序员,但是通过查看规范,我再次看到这里,您必须添加一个 Event.COMPLETE 侦听器,并且只读取数据在听者中。另外,我不认为您可以将数据(ByteArray 属性)直接转换为位图。
    • 再看你的原始代码,很有可能在 nativeDragDrop 处理程序中,你还需要在访问其数据属性之前对接收到的文件对象发出 load() 调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 2011-02-02
    • 1970-01-01
    相关资源
    最近更新 更多