Dear all,

I had for quite a while a problem to load images in the app dev blobstore. 
The problem was on the following line : "Map<String, BlobKey> blobs 
=blobstoreService
.getUploadedBlobs(req);"

In the javadoc, it is mentioned that the getUploadedBlobs is deprecated and 
we should use "getUploads" instead but the getUploads is not available. The 
error code I had was "Must be called from a blob upload callback request.". 
The appengine sdk is appengine-api-1.0-sdk-1.6.3.jar

The problem is apparently only occurring on the dev server. However, this 
creates a difficult situation where it is not possible to test using the 
dev server. In order to get around this problem, I have used the AppEngine 
file mechanism. You will find the code below. Just thought it could be 
useful for someone. 

--------------------------------------------------------------------------------


import org.apache.commons.fileupload.FileItemStream;

import org.apache.commons.fileupload.FileItemIterator;

import org.apache.commons.fileupload.servlet.ServletFileUpload;


import com.google.appengine.api.blobstore.BlobKey;

import com.google.appengine.api.blobstore.BlobstoreService;

import com.google.appengine.api.blobstore.BlobstoreServiceFactory;

import com.google.appengine.api.files.AppEngineFile;

import com.google.appengine.api.files.FileService;

import com.google.appengine.api.files.FileServiceFactory;

import com.google.appengine.api.files.FileWriteChannel;

import com.google.appengine.api.images.ImagesService;

import com.google.appengine.api.images.ImagesServiceFactory;


import java.io.InputStream;

import java.io.IOException;

import java.nio.ByteBuffer;

import java.util.logging.Logger;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;




public class UploadPropertyServlet extends HttpServlet {


 private static final long serialVersionUID = 1L;

private BlobstoreService blobstoreService = 
BlobstoreServiceFactory.getBlobstoreService();


 public void doPost(HttpServletRequest req, HttpServletResponse res)

 throws ServletException, IOException {

  BlobKey blobKey=null;

  try {


  FileService fileService= FileServiceFactory.getFileService();


  AppEngineFile file;


  ServletFileUpload upload = new ServletFileUpload();

 res.setContentType("text/plain");


  FileItemIterator iterator = upload.getItemIterator(req);

 while (iterator.hasNext()) {

  FileItemStream item = iterator.next();

  InputStream stream = item.openStream();


  if (item.isFormField()) {

  System.out.println("Got a form field: " + item.getFieldName());

  } else {

  System.out.println("Got an uploaded file: " + item.getFieldName() + ", 
name = " + item.getName());


   // You now have the filename (item.getName() and the

  // contents (which you can read from stream).  Here we just

  // print them back out to the servlet output stream, but you

  // will probably want to do something more interesting (for

  // example, wrap them in a Blob and commit them to the

  // datastore).


   String mimeType=item.getContentType();

  file = fileService.createNewBlobFile(mimeType);


   boolean lock = true;

  FileWriteChannel writeChannel = fileService.openWriteChannel(file, lock);



   int len;

  byte[] buffer = new byte[8192];

  while ((len = stream.read(buffer, 0, buffer.length)) != -1) {

   ByteBuffer buf = ByteBuffer.wrap(buffer, 0, len);  

   writeChannel.write(buf);

   //res.getOutputStream().write(buffer, 0, len);

  }

  writeChannel.closeFinally();

     blobKey = fileService.getBlobKey(file);

     System.out.println("Blob key:"+blobKey);

  }

 }

 } catch (Exception ex) {

 throw new ServletException(ex);

 }

  ImagesService imagesService = ImagesServiceFactory.getImagesService();

  String imageUrl = imagesService.getServingUrl(blobKey);

 System.out.println("imageUrl : "+ imageUrl);

  res.sendRedirect("/upload?imageUrl=" + imageUrl);



 }


 @Override

public void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException {

 doPost(request, response);

  String imageUrl = request.getParameter("imageUrl");

 response.setHeader("Content-Type", "text/html");



   response.getWriter().println(imageUrl);

}


}

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine for Java" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/google-appengine-java/-/wwlNsif5kEgJ.
To post to this group, send email to google-appengine-java@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.

Reply via email to