SORU
16 Ocak 2012, PAZARTESİ


Nasıl kullanmak için PrimeFaces p:fileUpload? Dinleyici yöntemi asla çağrılır

PrimeFaces kullanarak bir dosya upload etmeye çalışıyorum ama fileUploadListener yöntem yükleme tamamlandıktan sonra çağrılan değil.

İşte görünümü:

<h:form>
    <p:fileUpload fileUploadListener="#{fileUploadController.handleFileUpload}"
        mode="advanced" 
        update="messages"
        sizeLimit="100000" 
        allowTypes="/(\.|\/)(gif|jpe?g|png)$/"/>

    <p:growl id="messages" showDetail="true"/>
</h:form>

Ve bean:

@ManagedBean
@RequestScoped
public class FileUploadController {

    public void handleFileUpload(FileUploadEvent event) {
        FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName()   " is uploaded.");
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

}

Yöntemi kesme noktası yerleştirdim, ama hiç aramadı. mode="simple" ajax="false", kullanırken çağırdı, ama gelişmiş modda çalışmak istiyorum. Eclipse kullanarak ve 3.1 Önemli olan benim.

CEVAP
16 Ocak 2012, PAZARTESİ


<p:fileUpload> yapılandırma ile ilgili sorunları giderme PrimeFaces sürümüne bağlıdır.

Tüm sürümleri PrimeFaces

Aşağıda gereksinimleri tüm PrimeFaces sürümleri için geçerlidir:

  1. <h:form> enctype öznitelik 17* *için ayarlanmış olması gerekir. Bu olmadığında, ajax upload sadece işe yarayabilir, ama genel tarayıcı davranış ve kompozisyon ve tarayıcı/sürüm yapmak formda belirtilmemiş bağlıdır. Sadece her zaman güvenli tarafta olmak için belirtin.

  2. mode="advanced" (ajax upload yani, bu varsayılan) kullanarak, daha sonra <h:head> (usta) bir şablon olduğundan emin olun. Bu gerekli JavaScript dosyaları düzgün bir şekilde dahil olmasını sağlayacaktır. Bu mode="simple" için gerekli değildir (non-ajax upload), ama bu ' 'feel ve diğer tüm PrimeFaces bileşenleri işlevselliğini bak kıracak, zaten kaçırmak istemiyorum bu yüzden.

  3. Kullanırken mode="simple" (yani olmayan ajax upload), sonra da ajax olmalı devre dışı herhangi bir PrimeFaces komut düğmeleri/bağlantılar ajax="false" ve <p:fileUpload value> <p:commandButton action> yerine <p:fileUpload fileUploadListener>.

Eğer (otomatik) ajax desteği ile dosya yükleme (<h:head>! zihin) istiyorsan:

<h:form enctype="multipart/form-data">
    <p:fileUpload fileUploadListener="#{bean.upload}" auto="true" />
</h:form>
public void upload(FileUploadEvent event) {
    UploadedFile uploadedFile = event.getUploadedFile();
    String fileName = uploadedFile.getFileName();
    String contentType = uploadedFile.getContentType();
    byte[] contents = uploadedFile.getContents();
    // ...
}

Ya da eğer isterseniz non-ajax dosya upload:

<h:form enctype="multipart/form-data">
    <p:fileUpload mode="simple" value="#{bean.uploadedFile}" />
    <p:commandButton value="Upload" action="#{bean.upload}" ajax="false" />
</h:form>
private UploadedFile uploadedFile; //  getter setter

public void upload() {
    String fileName = uploadedFile.getFileName();
    String contentType = uploadedFile.getContentType();
    byte[] contents = uploadedFile.getContents();
    // ...
}

Ajax ile ilgiliauto, allowTypes, , *, *35updateonstart, vb gibi özellikleri olduğunu unutmayıngörmezden geldimode="simple". Tabii bunları belirtmek için böyle bir durumda.


PrimeFaces 5.x

Bu OLUMSUZLUK 2.2 kullanıyorsanız herhangi bir ek bilgi gerektirmez ve faces-config.xml senin de 2.2 sürümü AKSARAY uygun bildirildi. Bu PrimeFaces hiç upload dosya filtreleme gerekmez.

Eğer sen ancak kullanarak AKSARAY 2.2 henüz yapamazsın yükseltme (olmalı zahmetsiz zaman zaten bir Sunucu uygulaması 3.0 Uyumlu konteyner), o zaman ihtiyacınız için el ile kayıt altına PrimeFaces dosya upload filtre web.xml (ayrıştırma çok bölümü istek ve dolgu normal bir istek parametresi harita FacesServlet devam edin çalışan her zamanki gibi):

<filter>
    <filter-name>primeFacesFileUploadFilter</filter-name>
    <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>primeFacesFileUploadFilter</filter-name>
    <servlet-name>facesServlet</servlet-name>
</filter-mapping>

facesServlet <servlet-name> değeri tam olarak aynı web.xml 44 ** 43 *giriş değeri aynı olmalıdır. Yani 46 *örneğin*, sonra buna göre maç için düzenlemek gerekir.


PrimeFaces 4.x

PrimeFaces aynı hikaye 5.x 4 geçerlidir.x.

Sadece yüklenen dosya UploadedFile#getContents() ile içerik almak potansiyel bir sorun var. Bu yerel API Apache Commons FileUpload yerine kullanıldığında null dönecektir. UploadedFile#getInputStream() yerine kullanmanız gerekir. Ayrıca How to insert uploaded image from p:fileUpload as BLOB in MySQL? bkz

Yerel API bildirimi ile başka bir olası sorun upload bileşeni bir form farklı olan varsa "istek upload bileşeni işlemez. ateş" ajax düzenli. Ayrıca File upload doesn't work with AJAX in PrimeFaces 4.0/JSF 2.2.x - javax.servlet.ServletException: The request content-type is not a multipart/form-data bkz.

Her iki sorunun da Apache Commons FileUpload geçerek çözülebilir. Bakın PrimeFaces 3.x bölüm detay için.


PrimeFaces 3.x

Bu sürüm 2.2 / Sunucu uygulaması 3.0 yerel dosya upload AKSARAY desteklemiyor. El Apache Commons FileUpload yükleyin ve açıkça web.xml dosya upload filtre kaydetmeniz gerekir.

Aşağıdaki kitaplıkları gerekir:

Bu web çalışma zamanı sınıf bulunması gerekir. Maven kullanarak, en az zamanı (derleme varsayılan kapsam da iyidir) kapsamlı olduğundan emin olun. El ile Kavanoz taşımak, onlar /WEB-INF/lib klasör sonuna kadar emin olun.

Dosya upload filtre kayıt detayları PrimeFaces 5'te bulunabilir.x bölüm burada yukarıda. Diye kullanıyorsun PrimeFaces 4 ve istediğin açık olarak kullanın Apache Commons FileUpload yerine AKSARAY 2.2 / Sunucu uygulaması 3.0 yerel dosya upload, gerek daha sonra gelecek için söz konusu kütüphaneler ve filtre de aşağıda bağlam da param web.xml:

<context-param>
    <param-name>primefaces.UPLOADER</param-name>
    <param-value>commons</param-value><!-- Allowed values: auto, native and commons. -->
</context-param>

Sorun giderme

Hala işe yaramazsa, burada başka bir olası nedeni PrimeFaces yapılandırma ilgisiz:

  1. Eğer PrimeFaces upload filtre dosyası kullanıyorsanız sadece: çalışır . Filter web içinde başka bir şey Var ^em>öncebu PrimeFaces upload dosya filtreleme ve zaten örneğin*57, *, getReader(), **58 ufak tefek şeyler arayarak isteği vücut tüketmiştir. İstek bir beden sadece bir kez ayrıştırılması. Dosya upload filtre işini yapmadan önce bu yöntemlerden birini çağırdığınızda, sonra Dosya Yükleme süzgeci boş bir istek vücut olsun.

    Bunu düzeltmek için, dosya upload <filter-mapping> filtre koymak gerekirönceweb.xml diğer filtre. Eğer istek multipart/form-data bir istek varsa, o zaman dosya upload filtre ise hiçbir şey olmamış gibi devam edecek.

  2. Eğer PrimeFaces upload filtre dosyası kullanıyorsanız sadece çalışır . Eğer web uygulaması içinde Filter başka bir şey Var ^em>öncebu PrimeFaces upload filtre dosyası ve RequestDispatcher#forward() bir çağrı gerçekleştirdi. Genellikle, PrettyFaces gibi filtreler bu URL yeniden yazma. Bu FORWARD memuru tetikler, ama filtreleri REQUEST memuru sadece varsayılan olarak dinleyin.

    Bunu düzeltmek için, ya da PrimeFaces upload filtre dosyası koymak gerekiröncefiltre veya PrimeFaces upload filtre FORWARD memuru dinlemesi için dosya yeniden yönlendirme de:

    <filter-mapping>
        <filter-name>primeFacesFileUploadFilter</filter-name>
        <servlet-name>facesServlet</servlet-name>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>
    
  3. <h:form> bir iç içe var. Bu HTML yasadışı ve bir tarayıcı davranış belirsiz. Genellikle daha fazla, tarayıcı sunması beklenen veri göndermez. <h:form> yuvalama emin olun. Bu enctype formu tamamen bağımsız olarak. Sadece formları hiç yuva yok.

Eğer hala sorun yaşıyorsanız, iyi, HTTP trafik hata ayıklama. Bu tarayıcı Geliştirici Araçları (/Firebug23 /Internet Explorer 9, Chrome F12 tuşuna basın ) açık ve Net/Ağ bölümüne bakın. Eğer HTTP kısmı gayet iyi görünüyor, daha sonra AKSARAY kodu hata ayıklama. FileUploadRenderer#decode() kesme noktası koymak ve oradan ilerlemek.


Kaydetme dosyası yükledi

Sonunda çalışma var sonra, bir sonraki soru muhtemelen olacaktır "Nasıl/nereye yüklenen dosyayı kaydedin muyum?". Peki, devam edin işte: How to save uploaded file in JSF.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Film Riot

    Film Riot

    16 NİSAN 2006
  • graham025

    graham025

    25 NİSAN 2006
  • Matt Steffanina

    Matt Steffan

    1 EYLÜL 2011