当前位置: 首页 > 知识库问答 >
问题:

在GWT中,给定blobstore键的字符串版本,如何显示来自appengine服务器的图像

杨选
2023-03-14

在GWT中,我如何显示来自appengine服务器端blobstore的图像,给定密钥的字符串版本?

我想我已经在AppEngine上以blob的形式存储了一个图像。有人能告诉我这是不是正确的吗?

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上只显示默认图像图标

因此,我创建了一个servlet,它访问blobstore,如下所示:

import java.io.IOException;

导入javax.servlet.http.HttpServlet;导入javax.servlet.http.HttpServletRequest;导入javax.servlet.http.HttpServletResponse;

导入com.google.appengine.api.blobstore.blobkey;导入com.google.appengine.api.blobstore.blobstoreservice;导入com.google.appengine.api.blobstore.blobstoreserviceFactory;

公共类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个答案

羊禄
2023-03-14

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

在服务器上,我获得了如下上传url:

 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

但它提供了一条线索:即字符串的/_ah/img/部分

所以我决定尝试一下,并将这个URL提供给图像“/_AH/IMG/MR9SOTSECICEC4GZYSRNUEW”,这里是客户端代码。

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);
 类似资料:
  • 首先,我要说的是,我正在学习如何使用jquery/javascript编程,并且在使用JSON时遇到了一个问题。parse()。我了解格式,以及人们为什么使用它。。。但是在我的任何代码项目中都无法使用它。 我在书上/网上读过关于如何使用它的内容,但我觉得我读得太多了。我现在很困惑,并且在猜测我对它的了解。 话虽如此,我正在学习的jquery/javascript类要求我通过AJAX使用MAMP/l

  • 我在服务器(gae)中创建数据,并希望将其存储在BlobStore中。我看到了很多关于如何实现这一点的答案给客户机一个BlobStore URL,但是没有客户机或HTTP请求:这只是一个异步任务。 > 那么我想我应该使用createUploadUrl(),而不是将此URL提供给客户机,而是通过URL获取从我的代码HTTP将数据发布给它。这看起来很奇怪,不是有另外一个API吗? 假设我想要在Blob

  • 问题内容: 在JSON数据文件中,我有一个Unicode字符,如下所示: 我知道如何从JSON文件读取数据。当它包含如上所述表示的字符时,会发生此问题。 我将其读入字符串变量myUnicodeCharacterString中,该变量的值为“ \ u {25a1}”。顺便说一下,我无法在JSON数据文件中使用单个斜杠,因为在这种情况下,它无法将文件中的数据识别为正确的JSON对象,返回nil。 但是

  • 在我的模板中,我有以下内容: 在这篇文章中,我想突出显示字符串中的所有单词 所以我想我创建了一个新的刀片指令: 错误:缺少参数2 发现指令不包含2个参数。我尝试了所有我能找到的解决办法,但没有一个奏效。它们总是以普通字符串的形式返回参数,甚至不传递实际值。 我尝试添加一个助手函数,如下所述:https://stackoverflow.com/a/32430258/928666.不起作用: 错误:未

  • 在尝试了“php artisan存储:链接”等解决方案后,图像仍然无法在前端(vuejs)中显示。 图像本身存储在“storage/public/app/xxx.png”中 vuejs中的代码是。 我试图通过浏览器访问图像”http://127.0.0.1:80/api/storage/xxx.png,但导致“未找到” 任何线索都将不胜感激。

  • 一个api给我发送base64字符串,表示有一个图像。我有一个函数将这个字符串传输到blob存储。 当我用atob(b64Data)转换字符串时,出现以下错误: 如何用JavaScript解码?我尝试我的字符串与在线转换器(从base64到image)和工作良好。 谢谢