2012-05-12 22 views
3

私は同じリソース(私の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()方法を変更しようとしましたが、それはまだのように動作しません

私は言った!

+0

解決策を質問としてではなく回答として投稿する必要があります(タイトルにSOLVEDを入れず、受け入れたとマークするだけです)。 Stack OverflowはQ&Aサイトであり、ディスカッションフォーラムではありません。 – BalusC

+0

私は自分の答えを受け入れることはできませんでした! – StepTNT

+1

あなたはそれのためのポイントを得ることはありません:) – BalusC

答えて

3

代替ソリューションを使用してこれを解決したようです。

私は

download.xhtmlこのコードを持っている
<h:form style="float: right"> 
    <h:outputLink id="downloadDispensa" disabled="#{!loginBean.logged}" target="_blank" value="./download.xhtml?id=#{dispensa.id}"> 
     <pou:graphicImage value="./resources/images/download.png" height="30"/>          
    </h:outputLink>         
</h:form> 

にすべて

<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> 

を変更した:、

<script type="text/javascript"> 
    if(document.referrer == "" || document.referrer == "download.xhtml"){ 
     self.location='./index.xhtml'; 
    } 
    document.onblur = new Function('self.close()'); 
</script> 
<h:body onload="document.getElementsByClassName('downloadDispensa')[0].click();" rendered="#{loginBean.logged}"> 
    <h:form>    
     <h:commandLink class="downloadDispensa" id="downloadDispensa" style="display: none">     
      <pou:graphicImage value="./resources/images/download.png" height="30"/> 
      <pou:fileDownload value="#{dispensaBean.download}"/>                      
      <f:param name="dispensaId" value="#{request.getParameter('id')}"/> 
     </h:commandLink> 
    </h:form>   
</h:body> 
<h:body onload="self.location='./index.xhtml';" rendered="#{!loginBean.logged}"> 
</h:body> 

だから、ダウンロードページをロードするダウンロードリンクのautoclicksとダウンロードダイアログが表示されたときにページをオートクローズします。

関連する問題