Google app engine 上载Google云端点的图像时出错

Google app engine 上载Google云端点的图像时出错,google-app-engine,google-cloud-endpoints,blobstore,objectify,Google App Engine,Google Cloud Endpoints,Blobstore,Objectify,我正在尝试使用Google云端点将图像文件上载到Blobstore。下面的代码成功地将映像存储在Blobstore中,但没有在数据存储中创建实体“image”,因此它没有将映像引用添加到MyUser实体(我使用Objectify在数据存储中存储实体) 另外,当我上传图像时,我得到“404 NOT_FOUND”错误作为响应…但是图像正确地存储在Blobstore中 <html> <head> <meta http-equiv="content-type" co

我正在尝试使用Google云端点将图像文件上载到Blobstore。下面的代码成功地将映像存储在Blobstore中,但没有在数据存储中创建实体“image”,因此它没有将映像引用添加到MyUser实体(我使用Objectify在数据存储中存储实体)

另外,当我上传图像时,我得到“404 NOT_FOUND”错误作为响应…但是图像正确地存储在Blobstore中

<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
        <title>404 NOT_FOUND</title>
    </head>
    <body text=#000000 bgcolor=#ffffff>
        <h1>Error: NOT_FOUND</h1>
    </body>
</html>
这是上载处理程序:

@ApiMethod(name = "upload", httpMethod = "post")
    public Image upload(HttpServletRequest httpServletRequest) throws BadRequestException, NotFoundException, UnauthorizedException {
        String op = httpServletRequest.getParameter("op");
        if(op == null) throw new BadRequestException("op is null");

        Image image = null;

        if(op.equalsTo("registerUser") image = this.uploadRegisterUser(httpServletRequest);
        return image;
    }
上传注册器:

private Image uploadRegisterUser(HttpServletRequest httpServletRequest) throws NotFoundException {

        Long userId = Long.parseLong(httpServletRequest.getParameter("userId"));

        MyUser user = ofy().load().type(MyUser.class).filter("id",userId).first().now();

        if(user == null) throw new NotFoundException("User not found");

        Ref<Image> imageRef = this.saveImage(httpServletRequest, wUser, null);

        user.profileImage = imageRef;
        ofy().save().entity(wUser).now();

        return imageRef.getValue();
    }
private Image uploadRegisterUser(HttpServletRequest HttpServletRequest)引发NotFoundException{
Long userId=Long.parseLong(httpServletRequest.getParameter(“userId”));
MyUser user=ofy().load().type(MyUser.class).filter(“id”,userId).first().now();
如果(user==null)抛出新的NotFoundException(“未找到用户”);
Ref imageRef=this.saveImage(httpServletRequest,wUser,null);
user.profileImage=imageRef;
of y().save().entity(wUser.now();
返回imageRef.getValue();
}
保存图像:

private Ref<Image> saveImage(HttpServletRequest httpServletRequest, MyUser user, String label){

        List<BlobKey> blobs = blobstoreService.getUploads(httpServletRequest).get("file");
        Image image = new Image();
        image.key = blobs.get(0).getKeyString();
        image.user = Ref.create(user);
        image.date = new Date();
        image.label = label;

        return Ref.create(ofy().save().entity(image).now());
    }
private Ref saveImage(HttpServletRequest HttpServletRequest,MyUser user,字符串标签){
List blobs=blobstoreService.getUploads(httpServletRequest.get(“文件”);
图像=新图像();
image.key=blobs.get(0.getKeyString();
image.user=Ref.create(用户);
image.date=新日期();
image.label=标签;
返回Ref.create(of y().save().entity(image).now());
}

我错在哪里?提前谢谢。

我想你的处理人根本没有接到电话。云端点路径总是在/_ah/api/…之后。。。。因此,您的上载处理程序根本没有映射到blobstore上载路径。您必须创建一个单独的servlet,映射到/upload并将其添加到Web.xml。至少到目前为止,这是我的解决方案

创建一个单独的servlet,如下所示:

public class UploadgimageServlet extends HttpServlet {


private BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();

    public void doPost(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException {

        Map<String, BlobKey> blobs = blobstoreService.getUploadedBlobs(req);
        BlobKey blobKey = blobs.get(“file");

        if (blobKey == null) {
            res.sendRedirect("/");
        } else {
            res.sendRedirect("http://localhost:8888/getimage?blob-key=" + blobKey.getKeyString());
        }
    }
}
公共类UploadgimageServlet扩展了HttpServlet{
私有BlobstoreService BlobstoreService=BlobstoreServiceFactory.getBlobstoreService();
public void doPost(HttpServletRequest-req、HttpServletResponse-res)
抛出ServletException、IOException{
Map blobs=blobstoreService.getUploadedBlobs(req);
BlobKey-BlobKey=blobs.get(“文件”);
if(blobKey==null){
res.sendRedirect(“/”);
}否则{
res.sendRedirect(“http://localhost:8888/getimage?blob-key=“+blobKey.getKeyString());
}
}
}
将这些添加到web.xml中

<servlet>
     <servlet-name>Uploadgimage</servlet-name>
    <servlet-class>com.yourcomp.UploadgimageServlet</servlet-class>
 </servlet>

 <servlet-mapping>
    <servlet-name>Uploadgimage</servlet-name>
    <url-pattern>/imageManager/upload</url-pattern>  //Based on your original URL
  </servlet-mapping>

上传
com.yourcomp.UploadgimageServlet
上传
/imageManager/上传//基于您的原始URL

祝你好运!

blobstoreService.createUploadUrl()中回调方法的名称似乎是错误的。但我也尝试了,/\u ah/api/imageManager/v1/upload,只是“upload”…但没有运气!如何在localehost上测试它?
<servlet>
     <servlet-name>Uploadgimage</servlet-name>
    <servlet-class>com.yourcomp.UploadgimageServlet</servlet-class>
 </servlet>

 <servlet-mapping>
    <servlet-name>Uploadgimage</servlet-name>
    <url-pattern>/imageManager/upload</url-pattern>  //Based on your original URL
  </servlet-mapping>