質問: お世話になっております。 以下環境 Java: 1.7 Eclipse: 4.3 GAE: 1.9.30 Servlet: 2.5 appengine-gcs-client: 0.5 現在GCSに画像ファイルをアップロードし、ファイルのURLを返すとの処理をServletで 行っています。GCSとの連携はGCS Client Libraryを使用しています。 GCSにファイルをアップロードし、再度同じファイル名で別の画像をアップロードすると URLにアクセスした場合、最初にアップロードされたファイルが表示されます。 GCS内で確認するとファイルは更新されているのですが、URLだけがキャッシュされているようです。 URLの生成方法は ImagesService#getServingUrl と aclをpublic-readにし、公開URLを取得する この2パターンを試しましたが、どちらもキャッシュされるようです。 このキャッシュの動作を無効化し、常に新しいファイルのURLを返して欲しいのですが、 こうすればできたよって方いらっしゃいませんでしょうか? ImagesServiceを使いリサイズするといいともあったのですが、リサイズ処理なしでいきたいと 思っております。 cacheControl(“max-age=15”)などし、キャッシュコントロールも触ってみたのですが、 効果ありませんでした。 よろしくお願いいたします。 ※追記 無事URLが取得できました。URL差し替えの際にキャッシュされていたようです。
回答: Image Serviceは裏側はG+Photoのインフラを使っていて、Blobstore or Cloud Storageのファイルを、G+Photoにキャッシュしちゃってます。 こちらは、キャッシュ期間を制御する機能は無いんじゃないかなと思います。 キャッシュをまったく利用したくないのであれば、App Engineでは、BlobstoreServiceを使って、Cloud Storageのファイルを配信するのが良いかなと思います。 BlobstoreServiceについては、GAE/jでファイルを扱う Part2 を見ていただくと良いかなと思います。 後、すでにGCSに存在するファイルをBlobstoreServiceで扱う場合は Java_Using_the_Blobstore_API_with_Google_Cloud_Storage を参考にBlobKeyを生成してください。 実際、コード書いてみるとこんな感じですね。 HTTP Response Headerを編集したい場合は、BlobstoreService.serve(blobKey, response);をする前に編集しておけばOKです。 ``` BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); BlobKey blobKey = blobstoreService.createGsBlobKey("/gs/" + fileName.getBucketName() + "/" + fileName.getObjectName()); blobstoreService.serve(blobKey, response); ```