私は同じリソース(私のDBから取得)のダウンロードを許可する複数のページを持っています。PrimeFaces fileDownloadメソッドが呼び出されていませんか?
問題は、SAMEコードを使用してSAME Beanを呼び出しても、ダウンロードが一部でのみ機能することです。
作業中のページでは、ダウンロードリンクをクリックするとメッセージ/例外なしでページがリロードされるだけなので、何が起きているのか分かりません。それは何も印刷されないよう、
package ManagedBeans;
import ejb.DispensaManagerLocal;
import entity.Dispensa;
import entity.Utente;
import java.io.ByteArrayInputStream;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import org.primefaces.event.RateEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
/**
*
* @author stefano
*/
@ManagedBean
@RequestScoped
public class DispensaBean {
@EJB
private DispensaManagerLocal dispensaManager;
@ManagedProperty(value = "#{loginBean.utente}")
private Utente utente;
public Utente getUtente() {
return utente;
}
public void setUtente(Utente utente) {
this.utente = utente;
}
/**
* Creates a new instance of DispensaBean
*/
public DispensaBean() {
}
public StreamedContent getDownload() {
String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("dispensaId");
System.out.println("________" + id);
Dispensa d = dispensaManager.findById(Integer.parseInt(id));
String type = getMimeFromByte(d.getDatiFile());
String estensione = "";
if(type.equals("application/pdf")){
estensione = ".pdf";
} else if(type.equals("application/zip")) {
estensione = ".zip";
} else if(type.equals("application/vnd.ms-powerpoint")) {
estensione = ".ppt";
}
return new DefaultStreamedContent(new ByteArrayInputStream(d.getDatiFile()), type, d.getTitolo() + estensione);
}
private String getMimeFromByte(byte[] src) {
if (src[0] == 0x25 && src[1] == 0x50 && src[2] == 0x44 && src[3] == 0x46) {
return "application/pdf";
}
if (src[0] == 0x50 && src[1] == 0x4b) {
return "application/zip";
}
if (src[0] == 0xd0 && src[1] == 0xcf && src[2] == 0x11 && src[3] == 0xe0 && src[4] == 0xa1 && src[5] == 0xb1 && src[6] == 0x1a && src[7] == 0xe1) {
return "application/vnd.ms-powerpoint";
}
return "application/octet-stream";
}
}
は今、NON作業ページで、getDownload()
メソッドが呼び出されていない:
は、ここに私のBEANコードです。
ここで私が気づいたことは、ダウンロードリンクがだけではなく、メソッドを呼び出すのページをリロードし、これが唯一の#{dispensa.id}
がGETに依存しているページで起こるということであるダウンロードボタンコード
<h:form style="float: right">
<pou:commandLink id="downloadDispensa" ajax="false" disabled="#{!loginBean.logged}">
<pou:graphicImage value="./resources/images/download.png" height="30"/>
<pou:fileDownload value="#{dispensaBean.getDownload()}"/>
<f:param name="dispensaId" value="#{dispensa.id}"/>
</pou:commandLink>
</h:form>
ですパラメータ。
例えば、私はdispensa.xhtml
というページを持っています。このページには、GETパラメータが渡されなければ、DB内のすべてのファイルが表示されます。
実際、dispensa.xhtml?id=5
はid = 5のファイルのみを表示します。
ダウンロードリンクをクリックすると、問題なく動作します。 2番目のケースで実行すると、ページがリロードされ、GETパラメータが失われるため、dispensa.xhtml?id=5
の代わりにdispensa.xhtml
がロードされます。
私はGETパラメータを使用する際に問題があると思いますが、昨日はこれが変更されていませんでした。
他の非稼動ページはricerca.xhtml
であり、これはricerca.xhtml?key=query
で示されるクエリの(複数の)結果を示します。
最後に、物事を混乱させるために、ダウンロードはprofile.xhtml?user=username
で始まります。
これはGETパラメータに関する私の理論全体を破壊します。
ヌルbyte[] datiFile
を回避するには、I'vedはこのように私Dispensa
エンティティを編集した:
@Basic(optional = true, fetch=FetchType.EAGER)
@Lob
@Column(name = "datiFile")
private byte[] datiFile;
私が何をするか分からない、それは間違っている何が起こっているのか言っていないので、それだけで再読み込みしますページ、私のダウンロードをバイパス!
編集:私は、問題は、DB上のヌルデータによるものであれば理解することが、私のHD上にあるFile
を返すために、私のgetDownload()
方法を変更しようとしましたが、それはまだのように動作しません
私は言った!
解決策を質問としてではなく回答として投稿する必要があります(タイトルにSOLVEDを入れず、受け入れたとマークするだけです)。 Stack OverflowはQ&Aサイトであり、ディスカッションフォーラムではありません。 – BalusC
私は自分の答えを受け入れることはできませんでした! – StepTNT
あなたはそれのためのポイントを得ることはありません:) – BalusC