3

同じリソースのダウンロードを許可する複数のページがあります(DBから取得)。

問題は、同じコードを使用して同じBeanを呼び出した場合でも、ダウンロードがそれらの一部でのみ機能することです。

動作していないページでダウンロードリンクをクリックすると、メッセージや例外なしでページがリロードされるだけなので、何が起こっているのかわからないため、これは非常に厄介です。

これが私の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";
    }

}

現在、非作業ページでは、getDownload()何も出力しないため、メソッドは呼び出されません。

これがダウンロードボタンのコードです

<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.id}はGETパラメーターに依存するページでのみ発生することです。

たとえば、dispensa.xhtmlGETパラメータが渡されない場合に、DB内のすべてのファイルを表示するというページがあります。

実際、dispensa.xhtml?id=5id=5のファイルだけが表示されます。

最初のケースでは、ダウンロードリンクをクリックしても、問題なく機能します。2番目のケースでそれを行うと、ページがリロードされ、GETパラメータが失われるため、のdispensa.xhtml代わりにロードされますdispensa.xhtml?id=5

GETパラメータの使用には問題があると思いますが、昨日は機能し、このコードは変更しませんでした。

もう1つの非作業ページはricerca.xhtml、で指定されたクエリの(複数の)結果を表示しますricerca.xhtml?key=query

最後に、物事を台無しにするために、profile.xhtml?user=usernameWORKSでダウンロードしてください。

これは、GETパラメータに関する私の理論全体を破壊します。

nullが発生しないように、エンティティを次のようbyte[] datiFileに編集しました。Dispensa

@Basic(optional = true, fetch=FetchType.EAGER)
@Lob
@Column(name = "datiFile")    
private byte[] datiFile;

何が問題になっているのかがわからないため、どうすればよいかわかりません。ダウンロードをバイパスして、ページをリロードするだけです。

編集 :

getDownload()問題の原因がデータベースのnullデータであるかどうかを理解するために、HDにあるを返すようにメソッドを変更しようとしましFileたが、それでも機能しません。

4

2 に答える 2

3

別の解決策を使用してこれを解決したようです。

私はすべてを変えました

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

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

download.xhtmlこのコードはどこにありますか:

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

そのため、ダウンロードページをロードし、ダウンロードリンクを自動クリックして、ダウンロードダイアログが表示されたときにページを自動的に閉じます。

于 2012-05-16T12:30:31.677 に答える
0

私は同じ問題に直面しました。デバッグしたところ、サマリー画面であるため、別のテンプレート内にテンプレートを含めたため、フォーム内にフォームがあることがわかりました。そのため、すべてを含むルートxhtmlページを除いて、内部テンプレート内のすべてのh:formタグを削除しました。これらのテンプレートとそれは機能しました。

于 2019-01-30T15:14:31.133 に答える