今のところ選択したソリューション:
- 画像に適切なヘッダーを設定する予定です(この非常に良い回答を参照してください)
- URLをレンダリングするときに使用される更新された画像のローカルリストを保存します
パート2では説明が必要な場合があります。幸い、フロントエンドで非常に優れたJSフレームワークを使用しているため、任意のメソッドを定義してテンプレートで使用できます。モデルには写真のURLを返すメソッドが1つあり、このURLはすべてのテンプレートで使用されます。
新しい画像をアップロードするときに、IDをlocalStorageの現在のタイムスタンプに関連付けます。
window.localStorage['nocache.'+id] = new Date().getTime()
画像パスをリクエストするたびに、localStorageを調べて、URLにタイムスタンプを追加する必要があるかどうかを確認します。追加しない場合、URLはそのまま返されます。
利点/改善
- ユーザーが自分でトリガーした更新は、キャッシュの有効期限が切れた後だけでなく、すぐに利用できるようになります。
- 他のすべてのリソースはキャッシュを使用します。
localStorage
作成しているすべての画像URLを調べます。これは高額になる可能性があります。
- 写真のURLを作成するには、常にモデルのメソッドを使用する必要があります(DRYの観点からは良いですが、モデルを使用する必要があります)
コード
URLを生成するコードは次のようになります
getPhotoUrl: function() {
return api.getImageUrl(this.id)
}
APIで(非常に単純化)
getImageUrl: function(id) {
var url = "/prefix/something/user/" + id + "/image";
// if we have stored a timestamp, add that to the URL
var noCache = window.localStorage['nocache.'+id];
if (noCache !== undefined) {
url += "?" + noCache;
}
return url;
}
テンプレートコードは同じままです。
<!-- render via img.src -->
<img src="<%= user.getPhotoUrl() %>" alt="<%= user.lastname %>" />
<!-- render via CSS background -->
<div class="img" alt="<%= this.shortUsername %>"
style="background-image: url('<%= this.getPhotoUrl() %>')">
...
</div>