Я много боролся с этой проблемой, пока вчера не нашел решения с большой помощью из блога Ikai Lan .По сути, я сделал это, следуя его шагам, но с некоторыми изменениями, потому что выполнение его в точности так, как он это сделал, не работает для меня:
- Создать панель формы: установить кодирование multipart, метод post.
Создайте удаленную службу GWT, которая имеет только один метод: public String getUploadURL () или что-то в этом роде, и в IMPL напишите:
BlobstoreService service = BlobstoreServiceFactory.getBlobstoreService();
return service.createUploadUrl("/XXX/YYY");
В XXX вы должны указать путь к своему проекту, например, у меня com.fer.pyn.PictureYourNews
- В YYY вы должны указать имя отображения сервлета для нового сервлета, который нам нужно будет создать: Iположить XXX = BlobUploader, я создал BlobUploader, расширяет HttpServlet, и вы должны обновить web.xml.
Окей, так что это странная часть, которую я не могу понять, дело в том, что когдамы выполняем 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-объект:
Что вам нужно сделать сейчас, это создатьсервлет YYY, о котором мы говорили в шаге 4.
В методе 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.
- То, что вы делаете, - это получение ключа для своего BLob, чтобы вы могли ссылаться на него позже.
Наш следующий шаг показываетзагруженное изображение обратно в слой GWT:
//In the same post method from step 7
ImagesService imagesService = ImagesServiceFactory.getImagesService();
String imageURL = imagesService.getServingUrl(blobKey);
response.sendRedirect("/XXX/YYY?imgURL="+imageURL);
Теперь в методе get:
String imageUrl = request.getParameter("imgURL");
response.setHeader("Content-Type", "text/html");
response.getWriter().println(imageUrl);
Мы закончили, теперь выпросто нужно
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
}
});