Simple file upload using Flex UI and Spring/Hibernate/BlazeDS backend?
我是Flex和BlazeDS的新手,我正在尝试实现一个简单的应用程序,该应用程序在前端使用Flex,在后端使用Spring / Hibernate应用程序,两者之间的通信通过BlazeDS进行频道。
我正在寻求有关最佳和/或最简单方法的指导。我以这样一种方式设置了UI,即向用户显示一个文件选择器,他们在其中选择要上传的图像文件。选择并提交(作为表单提交)后,服务器端应接收图像文件数据以及一些相关元数据,例如描述和日期,然后使用图像文件数据和相关元数据填充Hibernate实体/ POJO。 ,然后将实体/ POJO持久保存到数据库中。
我在此处找到了一些示例,说明如何使用servlet和FileReference类(此处和此处)进行文件上载和下载,但是这些示例似乎并没有以利用BlazeDS和/或使用BlazeDS的方式解决该问题。Spring/Hibernate。我想将图像文件数据和相关的元数据(描述,捕获日期等)放入Flex应用程序中的值对象,然后通过BlazeDS将其发送到由我在Tomcat上运行的Spring / Hibernate应用程序提供的服务。在此服务中,我想从Flex应用程序发送的值对象中提取图像数据(实际的JPG / PNG / GIF数据和相关的元数据,例如描述等)到实体/ POJO中,然后通过hibernate在我的数据库中。
可以做到这一点吗?如果是,最好的解决方法是什么?我是否误以为如果我使用BlazeDS,那么我就以某种方式绕过了在服务器端提供诸如servlet之类的基于HTTP的服务的需求,而是可以将Java服务用作" RemoteObjects "吗?进行这种传输时,Java POJO /实体类和Flex值对象类之间是否必然存在一对一的映射?如果是这样,那么有一个工具可以从Java POJO创建相应的Flex值对象,反之亦然。
在此先感谢您的帮助,评论,建议等。
-詹姆斯
更新:一些使这一点更清楚的代码:
我将其作为Flex中的值对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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() {} } |
我假设这可以用作我的服务和服务器端DAO类所使用的POJO类的一对一映射,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | 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对象的字段,然后在映射到在Tomcat上运行的服务的RemoteObject。我在Flex代码中使用Image值对象作为参数进行了RemoteObject服务调用,但是在服务方运行的服务方法实际上期望使用POJO /实体类型的参数,这就是我在想的Flex值对象和Java POJO之间会发生某种转换/转换(通过值对象的类声明上的RemoteClass别名设置),但是似乎并没有发生这种情况,因为当我调试应用程序,当进行服务调用时,Java服务仅获取空值。
在我的Flex应用程序中,我有一个FileReference和Image值对象,它们是可绑定的公共变量:
1 2 3 4 | [Bindable] public var imageToBeArchivedFileReference:FileReference = new FileReference(); [Bindable] public var imageToBeArchivedValueObject:valueobjects.Image = new valueobjects.Image(); |
当用户单击文件选择按钮时,还有一个事件处理程序可浏览文件:
1 2 3 4 5 6 7 8 | 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); } |
有它建立当图像文件已被选择的值对象的事件处理程序:
1 2 3 4 5 6 7 8 | 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; } |
还有一个事件处理程序,当用户单击"提交"按钮以执行图像保存/上传时,将调用该事件处理程序:
1 2 3 4 | protected function archiveImageButton_clickHandler(event:MouseEvent):void { imageArchivalService.archiveImage(imageToBeArchived); } |
在服务器端,我的Java类正在简单地保存POJO:
1 2 3 4 | public void archiveImage(final Image image) { imageDao.saveOrUpdate(image); } |
当我在上面的方法中设置一个断点并查看image变量时,它看起来是空的,因此我假设从Flex值对象到Java POJO的转换未按预期进行,并且\\不仅仅是在Flex值对象类中添加RemoteClass别名。
看看这个例子,就在那里。
http://biemond.blogspot.com/2008/08/flex-upload-and-download-with-blazeds.html
不要使用加载程序类,请使用readBytes调用。
确保您进入评论,那里有有价值的信息。
干杯