Загрузка формы GWT с помощью BlobstoreService App Engine - PullRequest
1 голос
/ 14 июня 2010

Я использую GWT и Google App Engine Java для своего приложения. У меня есть экран профиля, где Пользователь вводит информацию профиля, такую ​​как имя, возраст и адрес, сохраняет ее и получает сообщение об успехе или неудаче. Я разработал это первоначальное приложение, используя GWT-RPC, и оно работало нормально. У меня было новое требование, где я должен хранить изображение пользователя. Я использую BlobstoreService для хранения изображений. Это создало осложнения в потоке. Мне пришлось использовать FormPanel, так как это единственный способ сделать FileUpload в GWT. Сервлет службы BlobStore ожидает перенаправления по завершении. В результате теперь он не может вернуть какой-либо статус обратно в мое приложение GWT после сохранения профиля. Легко ли хранить изображения с помощью GWT вместе с другими полями формы и показывать пользователю статусное сообщение после сохранения профиля.

Ответы [ 4 ]

3 голосов
/ 06 июня 2011

Я много боролся с этой проблемой, пока вчера не нашел решения с большой помощью из блога Ikai Lan .По сути, я сделал это, следуя его шагам, но с некоторыми изменениями, потому что выполнение его в точности так, как он это сделал, не работает для меня:

  1. Создать панель формы: установить кодирование multipart, метод post.
  2. Создайте удаленную службу GWT, которая имеет только один метод: public String getUploadURL () или что-то в этом роде, и в IMPL напишите:

    BlobstoreService service = BlobstoreServiceFactory.getBlobstoreService();
    return service.createUploadUrl("/XXX/YYY");
    
  3. В XXX вы должны указать путь к своему проекту, например, у меня com.fer.pyn.PictureYourNews

  4. В YYY вы должны указать имя отображения сервлета для нового сервлета, который нам нужно будет создать: Iположить XXX = BlobUploader, я создал BlobUploader, расширяет HttpServlet, и вы должны обновить web.xml.
  5. Окей, так что это странная часть, которую я не могу понять, дело в том, что когдамы выполняем RPC-вызов getUploadURL () в удаленном сервисе из шага 2, который возвращает странные адреса, такие как: '/ _ah / img / eq871HJL_bYxhWQbTeYYoA', и это - действие, которое вы должны вставить в форму с первого шага.Вам необходимо обновлять действие формы каждый раз, поэтому я предлагаю следующее:

    public void initBlobStoreSession()
    

    {imageService.getBlobStoreUploadURL (new AsyncCallback () {

        @Override
        public void onSuccess(String result) {
            uploadFormPanel.setAction(result);
            System.out.println("Upload Form Panel Action set");
        }
    
        @Override
        public void onFailure(Throwable caught) {
            //oops
        }
    });
    

    }

    Поэтому, когда вы отправляете свою панель fromPanel, она загружает BLOB-объект, и вам не нужно ничего делать, сложная часть заключается в том, как получить BLOB-объект:

  6. Что вам нужно сделать сейчас, это создатьсервлет YYY, о котором мы говорили в шаге 4.

  7. В методе post это важно:

    private BlobstoreService blobService = BlobstoreServiceFactory.getBlobstoreService();
    Map<String, BlobKey> blobMap = blobService.getUploadedBlobs(request);
    BlobKey blobKey = blobMap.get(UPLOAD_WIDJET_NAME);
    

UPLOAD_WIDJET_NAME - это.setName для виджета FileUpload.

  1. То, что вы делаете, - это получение ключа для своего BLob, чтобы вы могли ссылаться на него позже.
  2. Наш следующий шаг показываетзагруженное изображение обратно в слой GWT:

    //In the same post method from step 7
    ImagesService imagesService = ImagesServiceFactory.getImagesService();
    String imageURL = imagesService.getServingUrl(blobKey);
    response.sendRedirect("/XXX/YYY?imgURL="+imageURL);
    
  3. Теперь в методе get:

    String imageUrl = request.getParameter("imgURL");
    response.setHeader("Content-Type", "text/html");
    response.getWriter().println(imageUrl);
    
  4. Мы закончили, теперь выпросто нужно

uploadFormPanel.addSubmitCompleteHandler (новый SubmitCompleteHandler () {

        @Override
        public void onSubmitComplete(SubmitCompleteEvent event) {

            uploadFormPanel.reset();
            initBlobStoreSession();
            String imageUrl = event.getResults();
            Image image = new Image();
            image.setUrl(imageUrl);
            //if you are using jetty, leave this on
                            //or else it wont work
                            //Don't use GWT.getModuleBaseURL(), it doesnt 
                            //work well in development mode
            imageUrl.replace("http://0.0.0.0:8888/", "");
            System.out.println(imageUrl);
            final PopupPanel imagePopup = new PopupPanel(true);
            imagePopup.setWidget(image);


            // Add some effects

            imagePopup.setAnimationEnabled(true); // animate opening the image

            imagePopup.setGlassEnabled(true); // darken everything under the image
            imagePopup.setAutoHideEnabled(true); // close image when the user clicks
            imagePopup.center(); // center the image


        }
    });
1 голос
/ 07 июня 2011

проверить upload4gwt какой адрес загружается в GWT на AppEngine.

(раскрытие: я создал upload4gwt; он еще не созрел, но может быть полезен)

0 голосов
/ 26 июня 2010

Да, с GWT все становится сложнее.

Вы можете сохранить данные формы и изображение в отдельных RPC и либо включить сообщение о состоянии в ответ на загрузку изображения, либо запустить 3-й RPC, когда форма вернется, чтобы получить любой необходимый вам статус или метаданные.

0 голосов
/ 15 июня 2010

У меня была такая же проблема.В качестве обходного пути я использую перенаправление на сервлет, который печатает сообщение о состоянии для анализа клиентом.Я передаю строковое веб-представление ключа этого результирующего сервлета.

Это немного глупо, я бы хотел, чтобы кто-то пришел с лучшим ответом или объяснил, почему сервлет магазина должен перенаправить.1003 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...