GWT with GAE Blobstore

136 views
Skip to first unread message

compuroad

unread,
May 5, 2010, 9:44:43 PM5/5/10
to Google Web Toolkit
I am trying to use GAE Blobstore with GWT. I have changed the sample
they have online:

http://code.google.com/appengine/docs/java/blobstore/overview.html

I replaced the jsp page with a GWT page (below). I replaced the call
to "<%= blobstoreService.createUploadUrl("/upload") %>" with a RPC
call which is initiated by "controller.getUploadURL("/index").

However I am getting the following error:

SEVERE: [1273002680440000] javax.servlet.ServletContext log: Exception
while dispatching incoming RPC call
com.google.gwt.user.server.rpc.UnexpectedException: Service method
'public abstract java.lang.String
net.compuroad.cerrado.client.data.DataAccessService.getUploadURL(java.lang.String)'
threw an unexpected exception: java.lang.NoClassDefFoundError: com/
google/appengine/api/blobstore/BlobstoreServiceFactory

at
com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:
360)
at
com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:
546)
at
com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:
166)

I have installed GAE SDK 1.3.3.1. Any ideas will be appreciated.

Thanks,

Wilson

//GWT page to upload the images:

public class ImagePage2 extends Page {

private String[] mediaList = {"Select
media","picture","video"};
private FileUpload upload = null;

private Controller controller = null;
private static CerradoConstants constants = null;

private final FormPanel form = new FormPanel();
private VerticalPanel panel = new VerticalPanel();
private FlexTable table = new FlexTable();

private Button btnAddImage = new Button("Add Image");

private Button btnUpload = new Button("Upload");

private TextBox txtPropertyID = new TextBox();
private TextBox txtPropertyName = new TextBox();


/**
* Constructor
*/
public ImagePage2(final Controller controller, final
CerradoConstants constants) {

this.constants = constants;
this.controller = controller;

// Create a FormPanel and point it at a service.
//form.setAction(GWT.getModuleBaseURL() +"Image");

// Because we're going to add a FileUpload widget, we'll
need to set the
// form to use the POST method, and multipart MIME
encoding.
form.setEncoding(FormPanel.ENCODING_MULTIPART);
form.setMethod(FormPanel.METHOD_POST);
form.setWidget(panel);


btnAddImage.addClickHandler( new ClickHandler(){

@Override
public void onClick(ClickEvent event) {
upload = new FileUpload();
upload.setName("uploadForm");
upload.setSize("450px", "25px");
panel.add(upload);
}

});

btnUpload.addClickHandler( new ClickHandler(){

@Override
public void onClick(ClickEvent event) {
/****** This call initiates the RPC call
and generates the error ******/
controller.getUploadURL("/index");
}

});

//********The upload URL should come back from the RPC
call controller.getUploadURL("/index") using this listener

controller.getData().addPropertyChangeListener("uploadURL", new
PropertyChangeListener(){

@Override
public void propertyChange(PropertyChangeEvent
event) {
String path = null;
if (event.getNewValue()!= null){
path = (String )
event.getNewValue();

Window.alert("Upload URL:
"+path);
form.setAction(path);
form.submit();

}


}


});

panel.add(btnAddImage);
panel.add(btnUpload);

// Add an event handler to the form.
form.addFormHandler(new FormHandler() {

@Override
public void onSubmit(FormSubmitEvent event) {



}

public void onSubmitComplete(SubmitCompleteEvent event)
{

Window.alert(event.getResults());
}

@Override
public void onSubmitComplete(FormSubmitCompleteEvent
event) {
// TODO Auto-generated method stub

Window.alert(event.getResults());

}

});

// Add a 'submit' button.
panel.add(new Button( "Submit", new ClickListener() {

public void onClick(Widget sender) {


form.submit();

}
}));

}//end constructor

@Override
public void hide() {
RootPanel.get("content").clear();

}

@Override
public void propertyChange(PropertyChangeEvent event) {
// TODO Auto-generated method stub

}

@Override
public void show() {
// TODO Auto-generated method stub

//String text =


String title = null;
HTML htmlTitle = new HTML();

if (controller.getData().getProperty() != null){
title = "<p class='accTitle'>Add Images to the
Property</p>";

//set the value inside Name like "propertyID:
12345";
txtPropertyID.setName("propertyID");
txtPropertyName.setName("propertyName");


txtPropertyID.setText(controller.getData().getProperty().getId()+"");

txtPropertyName.setText(controller.getData().getProperty().getName());

txtPropertyID.setVisible(false);
txtPropertyName.setVisible(false);

panel.add(txtPropertyID);
panel.add(txtPropertyName);

}

htmlTitle.setHTML(title);

RootPanel.get("content").clear();
RootPanel.get("content").add(htmlTitle);
// RootPanel.get("content").add(description);
RootPanel.get("content").add(form);

Cerrado.getInstance().getTopLinks().show();

}

private String getUploadURL(){

return null;
}

}

//Client Controller:

public class Controller {

private CerradoData data = null;

private DataAccessServiceAsync service = null;

private String source = null;


public Controller (CerradoData data){

this.data = data;
this.service = GWT.create(DataAccessService.class);

}

//some omitted code ...

public void getUploadURL(String path) {


AsyncCallback<String> callback = new AsyncCallback<String>()
{

public void onFailure(Throwable caught) {

data.setMessage(caught.getMessage());
// data.firePropertyChange(null);

System.out.println(caught.getStackTrace());

}

public void onSuccess(String result) {

data.fireUploadURLChange(result);

System.out.println("upload path: "+ result);

}

};

// Make the call to the service.
service.getUploadURL(path, callback);

}//end of getUploadURL



//RPC Server class:

public class DataAccessServiceImpl extends RemoteServiceServlet
implements DataAccessService{

private PersistenceManager pm;

private static DataAccessServiceImpl instance;

public DataAccessServiceImpl(){
pm = PMF.get().getPersistenceManager();

instance = this;
}

public static DataAccessServiceImpl getInstance(){

if (instance == null){
instance = new DataAccessServiceImpl();
}

return instance;

}

//some omitted code ...



public String getUploadURL(String successPath){
BlobstoreService service =
BlobstoreServiceFactory.getBlobstoreService();

return service.createUploadUrl(successPath);


}





--
You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group.
To post to this group, send email to google-we...@googlegroups.com.
To unsubscribe from this group, send email to google-web-tool...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.

compuroad

unread,
May 9, 2010, 11:47:54 AM5/9/10
to Google Web Toolkit
I have installed GAE SDK 1.3.3.1. What I don't understand is why GWT
is looking for a GAE class "BlobstoreServiceFactory" that is only
called in the server side via RPC. Any ideas will be appreciated.
/***This call initiates the RPC and generates
the error **/
controller.getUploadURL("/index");
}
});
//the upload URL should come back from the RPC call
//Client Controller class:

compuroad

unread,
May 11, 2010, 6:16:13 AM5/11/10
to Google Web Toolkit
Anyone?

On May 9, 11:47 am, compuroad <wilson.ferreira...@gmail.com> wrote:
> I am trying to use GAEBlobstorewith GWT. I have changed the sample

rudolf michael

unread,
May 11, 2010, 6:20:54 AM5/11/10
to google-we...@googlegroups.com
you cannot use RPC to upload files as i may know.
when uploading you need to submit a HTML form.

best regards,
Rudolf Michael

Brandon Donnelson

unread,
Sep 6, 2010, 12:54:38 PM9/6/10
to Google-We...@googlegroups.com
Message has been deleted

Ikai Lan

unread,
Sep 7, 2010, 1:25:54 PM9/7/10
to Google Web Toolkit
Here's a sample project I'm working on that does an upload to
blobstore as well as uses the high performance image serving
framework:

http://github.com/ikai/gwt-gae-image-gallery

Warning: This is still a work in progress, but the upload/image
serving bits are there.
Reply all
Reply to author
Forward
0 new messages