1

次のコードを使用して、画像を Datastore の Blob に正常に保存します。

@RequestMapping(value = "/add", method = RequestMethod.POST)
public String add(ModelMap model, Product form, HttpServletRequest request) {
      if(ServletFileUpload.isMultipartContent(request)) { // if(form.getImage().getBytes().getSize() != 0) {
          try { 
              Blob file = new Blob(form.getImage().getBytes()); 
              form.setImg(file);
          } catch (IOException  e) { 
              e.printStackTrace(); 
          }
      }
 //save to datastore etc
}

そして、それを BlobStore に保存して、Blob キーをデータストアに保存しようとしました。可能ですか?これは私のスニペットですが、うまくいきません:

@RequestMapping(value = "/add", method = RequestMethod.POST)
public String add(ModelMap model, Product form, HttpServletRequest request) {
      Map<String, BlobKey> blobs = blobstoreService.getUploadedBlobs(request);
      BlobKey blobKey = blobs.get("image");
      form.setImage1(blobKey); 
      //save to datastore etc
}

この例から学びます。そして、私はこのエラーを受け取りました:

Must be called from a blob upload callback request.

スタックトレース :

java.lang.IllegalStateException: Must be called from a blob upload callback request.
at com.google.appengine.api.blobstore.BlobstoreServiceImpl.getUploads(BlobstoreServiceImpl.java:160)
at com.google.appengine.api.blobstore.BlobstoreServiceImpl.getUploadedBlobs(BlobstoreServiceImpl.java:144)
at com.shop.controller.ProductController.add(ProductController.java:92)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
    ....

解決 :

最後に、jsp で URL を生成する必要があることがわかりました。

<form:form action='<%=blobstoreService.createUploadUrl("/admin/product/add")%>' commandName="product" methodParam="POST" enctype="multipart/form-data">
4

1 に答える 1