Google app engine 将图像上载到google云存储后请求过多

Google app engine 将图像上载到google云存储后请求过多,google-app-engine,google-cloud-storage,Google App Engine,Google Cloud Storage,我用watchbucket命令观看地面军事系统的bucket。之后,我正在做一个上传。watch命令向appengine上的我的servlet发送通知。 为了确定这一点,我看了一下日志。但是看起来是这样的,servlet是如何一个接一个地获取请求的。四次成功,之后它会得到一个null指针异常。为什么有这么多的要求 *编辑* 在客户端,我使用meteorJS和Javascript框架。我添加了扩展slingshot来处理上传。 首先,我必须提供必要的信息,如acl、bucket等,如下所示: Sl

我用watchbucket命令观看地面军事系统的bucket。之后,我正在做一个上传。watch命令向appengine上的我的servlet发送通知。 为了确定这一点,我看了一下日志。但是看起来是这样的,servlet是如何一个接一个地获取请求的。四次成功,之后它会得到一个null指针异常。为什么有这么多的要求

*编辑* 在客户端,我使用meteorJS和Javascript框架。我添加了扩展slingshot来处理上传。 首先,我必须提供必要的信息,如acl、bucket等,如下所示:

Slingshot.createDirective('uploadSpotCover', Slingshot.GoogleCloud, {
   bucket: 'upload_spot_cover',
   GoogleAccessId: 'accessId',
   acl: 'project-private',
   maxSize: 0,
   cacheControl: 'no-cache', 
   ...
}
正如您在第153行中看到的,slingshot使用XMLHttpRequest上传到Cloudstorage

在服务器端,我的Servlet及其逻辑如下所示

公共类上载扩展了HttpServlet{

private BucketNotification notification;
@Override
public void doPost(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {

        this.notification = getBucketNotification(req);

        UploadObject object             = new UploadObject(notification);
        CloudStorageHandler gcs         = new CloudStorageHandler();
        BlobstoreHandler bs             = new BlobstoreHandler();
        ImageTransformHandler is        = new ImageTransformHandler();

        /** GET DATA FROM GCS **/

        byte[] data = gcs.getFileFromGoogleCloudStorage(object.getGcsBucket(), object.getGcsPath());
        //BlobKey bk = bs.createBlobKey(object.getGcsBucket(), object.getGcsPath());

        /******************/

        /** TRANSFORMATION **/

        byte[] newImageData = is.resizePicture(data, 1200, 1200, "JPEG", 65, 0.5, 0.5);

        /******************/

        /** STORE NEW RESIZED FILE INTO GCS BUCKET **/

        UploadObject tmp = new UploadObject(object.getGcsPath(), "JPEG", "beispiel", 1200, 1200);
        tmp.setData(newImageData);
        gcs.saveFileToGoogleCloudStorage(newImageData, "beispiel", object.getGcsPath(), "JPEG", "public-read");

        /******************/

        /** CREATE SERVING URL via BLOBKEY **/

        BlobKey bk_neu = bs.createBlobKey("beispiel", object.getGcsPath());
        String servingUrl = is.createServingUrlWithBlobkey(bk_neu);

        /******************/


        log("Blobkey: "+ bk_neu.getKeyString());
        log("url: "+ servingUrl);



        res.setStatus(200);
}




private BucketNotification getBucketNotification(HttpServletRequest req) {
    BucketNotification notification = null;
    String jsonString ="";
    try {
        jsonString ="";
        BufferedReader in = new BufferedReader(new InputStreamReader(req.getInputStream()));
        for (String buffer;(buffer = in.readLine()) != null;jsonString+=buffer + "\n");
        in.close();
        notification =  new Gson().fromJson(jsonString, BucketNotification.class);
    } catch (IOException e) {
      log("Failed to decode the notification: " + e.getMessage());

      return null;
    }
    return notification;
}
}


我将特定的服务方法(如将文件保存到cloudstorage)包装在自己的处理程序中

因为我不知道你在用什么上传,我现在猜。大多数文件上传都是成批上传,所以不是一次上传整个文件,而是以较小的块上传,直到一切就绪。这可以解释为什么你会接到多个电话。 你能给我们看一下服务器和客户端代码吗?也许这样我们可以看到问题。

我在:[……]上发现了这个问题,因此,默认情况下,gsutil将在1+2+4+8+16+32+60上重试23次。。。10秒钟,大约10分钟。通过编辑.Boto配置文件“[Boto]”部分中的num_retries和max_retry_delay配置变量,可以调整任何单个重试的重试次数和最大延迟。大多数用户不需要更改这些值。[…]因此我转到我的.boto文件并将num_条目更改为1,因为不允许使用0。不幸的是,一切都没有改变