Простая загрузка файлов с помощью Flex UI и бэкэнда Spring / Hibernate / BlazeDS? - PullRequest
2 голосов
/ 13 июля 2010

Я новичок в Flex и BlazeDS и пытаюсь реализовать простое приложение, которое использует Flex на внешнем интерфейсе и приложение Spring / Hibernate на заднем конце, с обменом данными между ними по каналу BlazeDS.

Я ищу направление, чтобы найти лучший и / или самый простой способ приблизиться к этому. У меня пользовательский интерфейс настроен таким образом, что пользователю предоставляется средство выбора файлов, в котором они выбирают файл изображения, который хотят загрузить. Когда это выбрано и отправлено (как отправка формы), серверная сторона должна получить данные файла изображения, а также некоторые связанные метаданные, такие как описание и дата, а затем заполнить объект / POJO Hibernate данными файла изображения и связанными метаданными. и затем сохраните сущность / POJO в базе данных.

Я нашел несколько примеров того, как вы могли бы загружать и скачивать файлы, используя сервлеты здесь и класс FileReference ( здесь и здесь ), но эти не решайте проблему таким образом, чтобы использовать BlazeDS и / или Spring / Hibernate. Я хочу поместить данные файла изображения и соответствующие метаданные (описание, дату захвата и т. Д.) В объект значения в приложении Flex, а затем отправить его через BlazeDS в службу, предоставляемую моим приложением Spring / Hibernate, работающим на Tomcat. В этом сервисе я хочу извлечь данные изображения (как фактические данные JPG / PNG / GIF, так и связанные метаданные, такие как описание и т. Д.) Из объекта значения, отправленного из приложения Flex, в сущность / POJO, которая затем сохраняется через Hibernate в моей базе данных.

Можно ли это сделать, и если да, то как лучше это сделать? Ошибаюсь ли я, полагая, что если я использую BlazeDS, то я каким-то образом обхожу необходимость предоставления служб на основе HTTP, таких как сервлеты, на стороне сервера, и вместо этого я могу использовать свои службы Java как «RemoteObjects»? Обязательно ли взаимно-однозначное сопоставление между Java POJO / классом сущностей и классом объектов значений Flex при выполнении такого рода передачи? Если да, есть ли инструмент, который создает соответствующие объекты значений Flex из Java POJO или наоборот.

Заранее спасибо за помощь, комментарии, предложения и т. Д.

- Джеймс

Обновление : Некоторый код, чтобы сделать это более понятным:

У меня есть это в качестве моего объекта значения во 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. Я делаю вызов службы RemoteObject в своем коде Flex, используя объект значения Image в качестве аргумента, но метод службы, выполняемый на стороне сервера, фактически ожидает аргумент типа POJO / entity, и именно здесь я думаю, что какой-то произойдет преобразование / преобразование между объектом-значением Flex и Java POJO (благодаря настройке псевдонима RemoteClass в объявлении класса объекта-значения), но, похоже, этого не происходит, потому что при отладке приложения служба Java получает только нулевые значения, когда сделан сервисный вызов.

В моем приложении Flex у меня есть объект FileReference и значение изображения в качестве общедоступных, привязываемых переменных:

[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 не прошло, как ожидалось, и что к этому, чем просто добавление псевдонима RemoteClass в классе объекта значения Flex.

1 Ответ

3 голосов
/ 14 июля 2010

Посмотрите на этот пример, там все есть.

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

Не используйте класс загрузчика, используйте вызов readBytes.

Убедитесь, что выперейдите к комментариям, там есть ценная информация.

Приветствия

...