Простая загрузка файлов с использованием Flex UI и бэкэнда Spring / Hibernate / BlazeDS?

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

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

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

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


person James Adams    schedule 13.07.2010    source источник
comment
У меня есть приложение, загружающее локальный файл в объект FileReference (в результате того, что пользователь просматривает локальную файловую систему в поисках файла изображения), а затем я заполняю объект значения, который я отправляю, данными файла (как ByteArray) и Описание String. Затем я вызываю удаленную службу и передаю объект значения в качестве единственного аргумента. Когда он получен службой, работающей на Tomcat, я вижу только нулевые значения в полях соответствующего POJO, поэтому не похоже, что объект значения переводится в POJO и / или сериализуется, как ожидалось.   -  person James Adams    schedule 13.07.2010


Ответы (1)


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

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

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

Обязательно переходите к комментариям, там ценная информация.

Ваше здоровье

person Ernani Joppert    schedule 14.07.2010
comment
Спасибо за ссылку, Эрнани, и за указание на то, что мне нужно использовать вызов readBytes (). Проблема, с которой я все еще сталкиваюсь, заключается в том, что когда я делаю вызов службы RemoteObject с объектом значения Flex в качестве параметра, мне кажется, что я не получаю эквивалентного представления на стороне сервера, когда вызов службы получает сообщение. Когда я смотрю на полученный вызов службы в отладчике (на Tomcat), я вижу, что все поля в значении параметра POJO (которые, как я ожидаю, будут соответствовать параметру объекта значения в исходном вызове службы на стороне Flex) являются нулевой. - person James Adams; 14.07.2010
comment
Я подозреваю, что я неправильно использую псевдоним RemoteClass в классе объекта значения Flex и, следовательно, я не получаю сопоставление объекта значения Flex с Java POJO, для которого я собираюсь. Я отправлю еще один вопрос по этой конкретной теме, если я не смогу найти нужные мне подсказки через Google, и я обновлю здесь свои выводы на случай, если это может помочь кому-то еще в будущем. - person James Adams; 14.07.2010
comment
Эта ссылка помогла мне более или менее разобраться в этом, особенно указав, как правильно сопоставить типы данных между классами объектов значений Flex и классами Java POJO: liveocs.adobe.com/blazeds/1/blazeds_devguide/ - person James Adams; 14.07.2010
comment
Привет, дружище! Я рад, что это помогло вам каким-либо образом, не знаю, почему я не получил уведомления по электронной почте об этих ответах. Надеюсь, вы все нашли, если не дайте мне знать. Ура, Эрнани - person Ernani Joppert; 18.08.2010