私は richfaces 4 と JSF 2.1、特にタグrich:fileUploadとa4j:mediaOutputを使用しています。私の目標は、画像をアップロードしてプレビューすることです。次のコードがあります。
<rich:fileUpload id="upload" fileUploadListener="#{technicianBean.listener}" maxFilesQuantity="1" immediateUpload="true" ontyperejected="alert('Solo imágenes JPG');" acceptedTypes="jpg">
<a4j:ajax event="uploadcomplete" render="info" />
<a4j:ajax event="clear" listener="#{technicianBean.clearUploadData}" render="info" />
</rich:fileUpload>
<h:panelGroup id="info" layout="block" ajaxRendered="true" >
<a4j:mediaOutput element="img" mimeType="image/jpeg" createContent="#{technicianBean.paint}"
value="#{technicianBean.nickname}" style="width:100px; height:100px;" cacheable="false">
</a4j:mediaOutput>
</h:panelGroup>
と
@ManagedBean
@SessionScoped
public class TechnicianBean extends PersonBean {
private String nickname;
private UploadedImage file;
public TechnicianBean() {
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public UploadedImage getFile() {
return file;
}
public void setFile(UploadedImage file) {
this.file = file;
}
public void listener(FileUploadEvent event) throws IOException {
UploadedFile photo = event.getUploadedFile();
file = new UploadedImage();
file.setLength(photo.getData().length);
file.setName(photo.getName());
file.setData(photo.getData());
}
public void paint(OutputStream stream, Object object) throws IOException {
if (file != null) {
stream.write(file.getData());
stream.close();
}
//stream.write(((UploadedImage) object).getData());
}
public String clearUploadData() {
file = null;
return null;
}
}
問題は、 renderのタグa4j:ajax イベントにあると思います。たとえば、a4j:ajax event="clear"のリスナー (clearUploadData)は関数を実行しますが、両方の場合 ( uploadcompleteとclear ) で、画像 (つまり、内部に mediaOutuput がある panelGroup) を再レンダリングできません。新しい画像を削除またはアップロードすると、ページを更新しても (F5) コンテンツが適切に表示されますが、更新されます。
私は本当にそれに対処する方法がわかりません。ご関心をお寄せいただきありがとうございます。
PS: a4j:mediaOpututタグの値(ニックネーム) で混乱するかもしれませんが、ペイント関数では、ストリームにファイル属性を書き込んでいます。