読者です 読者をやめる 読者になる 読者になる

メモ:PrimeFaces GraphicImage で動的な画像を使うときのキャッシュの話し

公式ドキュメントの内容じゃないです。

公式ドキュメントは P.240 当たりに動的な画像のお話しが載ってます。

ソースコードさらっと見てのメモ。

primefaces/GraphicImageRenderer.java at 907f0a6d49ae50223cc98074b55b5d10d80c8764 · primefaces/primefaces · GitHub
primefaces/DynamicResourceBuilder.java at 907f0a6d49ae50223cc98074b55b5d10d80c8764 · primefaces/primefaces · GitHub

GraphicImage の cache を false に設定しないと、URL が同じになる。
普通毎回 Image を GET したくないので cache = true は設定する。
設定しなくてもデフォルト が true。

この場合、GraphicImage でとってくる画像を変更したくても、URL が変わらないと実際にサーバーにまで取ってきてくれない。
URL は graphicimage内 の param タグの値によっても変わるので、param の値が変更されるとサーバーに画像を取りに行く。
前回のサンプル sample/azurewebapps_jsf at master · OdaShinsuke/sample · GitHub だと param は name というキーにファイル名を渡す形にしているので、ファイル名が同じだけど、実際の画像が異なる場合はうまく動かない。*1

例:ファイルアップロード機能を付けて、ファイル名はユーザーが上げたファイル名そのままで保存した場合に、前の画像が表示されてしまう。

さくっと防ぐには、param を増やしてファイルが変わるたびに UUID.randomUUID() でもつけといたら回避できる。
ファイルアップロードがされるたびに 新しい UUID 生成するとか。

ザクッと適当なコード
前回のサンプルと組み合わせたら雰囲気伝わる?

@ViewScoped
@Named
class Bean implements Serializable {
  ...

  private String imageUUID;
  public String getImageUUID() {
    return imageUUID;
  }

  @postConstruct
  void postConstruct() {
    imageUUID = UUID.randomUUID().toString();
  }

  public void ファイルアップロードとか取ってくるファイルを変えたい時() {
    ...

    imageUUID = UUID.randomUUID().toString();
  }
}
<p:graphicImage ...>
  <p:param ...>
  <p:param value="uuid" value="#{bean.imageUUID}/>
</p:graphicImage>

*1:Azure にデプロイしてるwarでは cache=false にしてたので、毎回 URL が変わってるけど