首页 文章

在GWT中,如何在给定blobstore密钥的字符串版本的情况下从appengine服务器显示图像

提问于
浏览
0

在GWT中,如果给出密钥的字符串版本,如何从appengine服务器端blobstore显示图像?

我想我已经将一个图像存储在appengine上 . 谁能告诉我它是否正确?

try 
                            {
                                FileService fileService = FileServiceFactory.getFileService();
                                AppEngineFile file = fileService.createNewBlobFile(content_type, fileName);
                                boolean lock = true;
                                FileWriteChannel writeChannel = fileService.openWriteChannel(file, lock);
                                byte[] b1 = new byte[BUFFER_SIZE];
                                int readBytes1;
                                while ((readBytes1 = is.read(b1)) != -1) 
                                {
                                    writeChannel.write(ByteBuffer.wrap(b1, 0, readBytes1));
                                }

                                writeChannel.closeFinally();
                                item_image_blob_key = fileService.getBlobKey(file).getKeyString();
                            } 
                            catch (Exception e) 
                            {
                                System.out.println(e.getLocalizedMessage());
                                e.printStackTrace(response.getWriter());
                            }

我将密钥发送回客户端,我正在尝试呈现图像 . 我试过用:

ImagesService imagesService = ImagesServiceFactory
                .getImagesService();

        // Get the image serving URL
        String imageUrl = imagesService.getServingUrl(blobKey);

但它已被弃用,所以我试过:

ImagesService imagesService = ImagesServiceFactory.getImagesService();
              ServingUrlOptions suo = ServingUrlOptions.Builder.withBlobKey(blobKey);
              String image_url = imagesService.getServingUrl(suo);

              item.setProperty("image_url", image_url);

现在我得到一个如下所示的URL:

http://0.0.0.0:8888/_ah/img/5nXYgHwfiMmblDFldDXSew

并在客户端创建一个图像:

String image_url = result.get_image_url();
                    System.out.println("image url is: " + image_url);

                    Image image = new Image();
                    image.setUrl(image_url);

                    RootPanel.get("dynamicDate").add(image);

UI上仅显示默认图像图标

所以我创建了一个访问blobstore的servlet:

import java.io.IOException;

import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.google.appengine.api.blobstore.BlobKey; import com.google.appengine.api.blobstore.BlobstoreService; import com.google.appengine.api.blobstore.BlobstoreServiceFactory; public class ImageServlet扩展了HttpServlet {private static final long serialVersionUID = 1L; @Override public void doGet(HttpServletRequest req,HttpServletResponse res)抛出IOException {String blob_key = req.getParameter(“blob-key”);

if (blob_key != null) 
    {
      BlobKey blobKey = new BlobKey(blob_key);
      BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();

      blobstoreService.serve(blobKey, res);
    } 
    else 
    {
      res.sendError(400, "One or more parameters are not set");
    }

}}

和客户端http请求:

RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.GET, "/itemmanager/image");

                    try 
                    {
                        Request request = requestBuilder.sendRequest(null, new RequestCallback() {

                        public void onError(Request request, Throwable exception) 
                        {
                           System.out.println(exception.getMessage());
                        }

                        public void onResponseReceived(Request request, Response response) 
                        {
                            System.out.println("so far so good");
                            System.out.println(response.getHeadersAsString());

                          if (200 == response.getStatusCode()) 
                          {

                          } 
                          else 
                          {
                            // Handle the error.  Can get the status text from response.getStatusText()
                          }
                        }       
                          });
                        } catch (RequestException e) {
                          // Couldn't connect to server        
                        }

我似乎得到文本如何获得输入流或我可以获得图像的东西?

1 回答

  • 0

    最后经过两天的谷歌搜索和堆栈溢出并尝试我得到它!

    在服务器上我得到了上传网址:

    ImagesService imagesService = ImagesServiceFactory.getImagesService();
                  ServingUrlOptions suo = ServingUrlOptions.Builder.withBlobKey(blobKey);
                  String image_url = imagesService.getServingUrl(suo);
    
                  item.setProperty("image_url", image_url);
    

    appengine API产生了一个url,它在本地模式下无效[我认为它与sop跨平台问题有关]

    http://0.0.0.0:8888/_ah/img/mR9SOTSEizec4gZYsRnuEw
    

    但它提供了一个线索:即String的/ _ah / img /部分

    所以我决定尝试并将此URL提供给图像“/ _ah / img / mR9SOTSEizec4gZYsRnuEw”这是客户端代码 .

    String imageKey = result.get_image_key();
                        System.out.println("category is: " + result.get_category() + "   image blob key is: " + imageKey);
    
                        String image_url = result.get_image_url();
                        System.out.println("image url is: " + image_url);
    
                        //This doesn't work at least locally
                        /*Image image = new Image();
                        image.setUrl(image_url);
    
                        RootPanel.get("dynamicDate").add(image);*/
    
                        Image image2 = new Image();
                        image2.setUrl("/_ah/img/" + imageKey);
    
                        RootPanel.get("dynamicDate").add(image2);
    

相关问题