【问题标题】:Simple file upload using Flex UI and Spring/Hibernate/BlazeDS backend?使用 Flex UI 和 Spring/Hibernate/BlazeDS 后端的简单文件上传?
【发布时间】:2010-07-13 15:20:01
【问题描述】:

我是 Flex 和 BlazeDS 的新手,我正在尝试实现一个简单的应用程序,该应用程序在前端使用 Flex,在后端使用 Spring/Hibernate 应用程序,两者之间的通信通过 BlazeDS 通道进行。

我正在寻找解决此问题的最佳和/或最简单方法的方向。我以这样一种方式设置 UI,即向用户呈现一个文件选择器,他们可以在其中选择他们想要上传的图像文件。选择并提交(作为表单提交)时,服务器端应接收图像文件数据以及一些相关的元数据,例如描述和日期,然后使用图像文件数据和相关元数据填充Hibernate Entity/pojo ,然后将实体/POJO 持久化到数据库中。

我找到了一些示例,说明如何使用 servlet here 和 FileReference 类(herehere)进行文件上传和下载,但这些似乎并不能解决问题利用 BlazeDS 和/或 Spring/Hibernate。我想将图像文件数据和相关元数据(描述、捕获日期等)放入 Flex 应用程序中的值对象中,然后通过 BlazeDS 将其发送到运行在 Tomcat 上的 Spring/Hibernate 应用程序提供的服务。在此服务中,我想从 Flex 应用程序发送的值对象中提取图像数据(实际的 JPG/PNG/GIF 数据和相关元数据,如描述等)到实体/POJO 中,然后通过在我的数据库中休眠。

这可以做到吗?如果可以,最好的方法是什么?我是否错误地假设如果我使用 BlazeDS,那么我会以某种方式绕过在服务器端提供基于 HTTP 的服务(例如 servlet)的需要,而是可以将我的 Java 服务用作“RemoteObjects”?在进行这种传输时,Java POJO/实体类和 Flex 值对象类之间是否一定存在一对一的映射?如果是这样,是否有一个工具可以从 Java POJO 创建相应的 Flex 值对象,反之亦然。

提前感谢您的帮助、cmets、建议等。

--詹姆斯

更新:一些代码让这一点更清楚:

我在 Flex 中将此作为我的值对象:

package valueobjects
{
    import flash.utils.ByteArray;

    [Bindable]
    [RemoteClass(alias="com.abc.example.persistence.entity.Image")]

    public class Image
    {
        public var id:Number;
        public var captureDate:Date;
        public var description:String;
        public var imageData:ByteArray;

        public function Image() {}        
    }

我假设这可以用作我的服务使用的 POJO 类和服务器端 DAO 类的一对一映射,如下所示:

package com.abc.example.persistence.entity;

import java.sql.Blob;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;

@Entity(name = "IMAGE")
public class Image
    extends AbstractBaseEntity<Long>
{
    private String description;
    private Date captureDate;
    private Blob imageData;

    @Column(name = "CAPTURE_DATE", nullable = true)
    public Date getCaptureDate()
    {
        return captureDate;
    }

    @Column(name = "DESCRIPTION", nullable = true)
    public String getDescription()
    {
        return description;
    }

    @Column(name = "IMAGE_DATA", nullable = true)
    public Blob getImageData()
    {
        return imageData;
    }

    public void setCaptureDate(final Date captureDate)
    {
        this.captureDate = captureDate;
    }

    public void setDescription(final String description)
    {
        this.description = description;
    }

    public void setImageData(final Blob imageData)
    {
        this.imageData = imageData;
    }
}

在我的 Flex 应用程序中,我使用描述字符串、日期和图像文件数据(基于用户的文件选择和描述的文本输入)填充 Image 对象的字段,然后调用 RemoteObject 上的一个方法,该方法是映射到运行在 Tomcat 上的服务。我使用 Image 值对象作为参数在我的 Flex 代码中进行 RemoteObject 服务调用,但在服务端运行的服务方法实际上需要 POJO/实体类型的参数,我在这里认为某种Flex 值对象和 Java POJO 之间的转换/转换将发生(通过值对象的类声明上的 RemoteClass 别名设置),但它似乎没有发生,因为当我调试应用程序时 Java 服务仅在进行服务调用时获取空值。

在我的 Flex 应用程序中,我有一个 FileReference 和 Image 值对象作为公共的可绑定变量:

[Bindable]
public var imageToBeArchivedFileReference:FileReference = new FileReference();
[Bindable]
public var imageToBeArchivedValueObject:valueobjects.Image = new valueobjects.Image();

还有一个事件处理程序可以在用户单击文件选择按钮时浏览文件:

protected function imageFileSelectButton_clickHandler(event:MouseEvent):void
{
    var imageFileFilter:FileFilter = new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg;*.jpeg;*.gif;*.png");
    var fileTypes:Array = new Array();
    fileTypes.push(imageFileFilter);
    imageToBeArchivedFileReference.addEventListener(Event.SELECT, imageToBeArchived_fileSelectHandler);
    imageToBeArchivedFileReference.browse(fileTypes);
}

当图像文件被选中时,有一个事件处理程序会构建值对象:

private function imageToBeArchived_fileSelectHandler(event:Event):void
{
    imageToBeArchivedFileReference.load();
    imageToBeArchivedValueObject = new valueobjects.Image()
    imageToBeArchivedValueObject.imageData = imageToBeArchivedFileReference.data;
    imageToBeArchivedValueObject.description = imageToBeArchivedDescription.text;
    imageToBeArchivedValueObject.captureDate = imageToBeArchivedFileReference.creationDate;
}

当用户点击提交按钮执行图像保存/上传时,会调用一个事件处理程序:

protected function archiveImageButton_clickHandler(event:MouseEvent):void
{
    imageArchivalService.archiveImage(imageToBeArchived);
}

在服务器端,我的 Java 类正在简单地保存 POJO:

public void archiveImage(final Image image)
{
    imageDao.saveOrUpdate(image);
}

当我在上面的方法中设置断点并查看图像变量时,它看起来是空的,所以我假设从 Flex 值对象到 Java POJO 的转换没有按预期进行,还有更多不仅仅是在 Flex 值对象类中添加 RemoteClass 别名。

【问题讨论】:

  • 我让我的应用程序将本地文件加载到 FileReference 对象中(作为用户浏览本地文件系统以获取图像文件的结果),然后我用文件数据(作为 ByteArray)和描述字符串。然后我调用远程服务并将值对象作为唯一参数传递。当在 Tomcat 上运行的服务接收到它时,我只在相应 POJO 的字段中看到空值,因此似乎没有按预期将值对象转换为 POJO 和/或序列化。

标签: apache-flex hibernate spring blazeds


【解决方案1】:

看看这个例子,它就在那里。

http://biemond.blogspot.com/2008/08/flex-upload-and-download-with-blazeds.html

不要使用加载器类,使用 readBytes 调用。

确保你去 cmets,那里有有价值的信息。

干杯

【讨论】:

  • 感谢 Ernani 提供此参考,并指出我需要使用 readBytes() 调用。我似乎仍然面临的问题是,当我使用 Flex 值对象作为参数进行 RemoteObject 服务调用时,当服务调用接收到消息时,我似乎没有在服务器端获得等效的表示。当我在调试器(在 Tomcat 上)中查看接收到的服务调用时,我看到 POJO 参数值中的所有字段(我希望它们对应于 Flex 端的原始服务调用中的值对象参数)是空。
  • 我怀疑我在 Flex 值对象类中没有正确执行 RemoteClass 别名,因此我没有将 Flex 值对象映射到我要使用的 Java POJO .如果我无法通过 Google 找到我需要的线索,我将发布关于此特定主题的另一个问题,我会在此处更新我的发现,以防将来对其他人有所帮助。
  • 这篇参考资料或多或少地帮助我弄清楚了这一点,特别是指出了如何在 Flex 值对象类和 Java POJO 类之间正确映射数据类型:livedocs.adobe.com/blazeds/1/blazeds_devguide/…
  • 嘿,欢迎您!我很高兴它以任何方式帮助了您,不知道为什么我没有收到有关这些回复的任何电子邮件通知。希望你找到了一切,如果不让我知道。干杯,埃尔纳尼
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多