Yapılandırma ve sorun giderme işlemleri <p:fileUpload>
PrimeFaces sürümüne bağlıdır.
Tüm PrimeFaces sürümleri
Aşağıdaki gereksinimler tüm PrimeFaces sürümleri için geçerlidir:
enctype
Öznitelik <h:form>
ihtiyaçlarına ayarlanmalıdır multipart/form-data
. Bu olmadığında, ajax yüklemesi sadece çalışabilir, ancak genel tarayıcı davranışı belirtilmez ve form kompozisyonuna ve web tarayıcısı marka / sürümüne bağlıdır. Her zaman güvenli tarafta olmasını belirtin.
Kullanırken mode="advanced"
(yani ajax yüklemesi, bu varsayılandır), ardından <h:head>
(ana) şablonda bir tane bulunduğundan emin olun . Bu, gerekli JavaScript dosyalarının düzgün bir şekilde dahil edilmesini sağlayacaktır. Bu, mode="simple"
(ajax dışı yükleme) için gerekli değildir , ancak bu, diğer tüm PrimeFaces bileşenlerinin görünüşünü ve işlevselliğini bozacaktır, bu yüzden yine de bunu kaçırmak istemezsiniz.
Kullanırken mode="simple"
(yani ajax dışı yükleme), o zaman ajax herhangi bir PrimeFaces komut düğmesinde / bağlantılarında tarafından devre dışı bırakılmalıdır ajax="false"
ve (PrimeFaces <= 7.x için) veya (PrimeFaces> = 8.x için ) yerine <p:fileUpload value>
with <p:commandButton action>
kullanmalısınız.<p:fileUpload fileUploadListener>
<p:fileUpload listener>
Yani, ajax desteğiyle (otomatik) dosya yüklemek istiyorsanız (aklınızda bulundurun <h:head>
!):
<h:form enctype="multipart/form-data">
<p:fileUpload fileUploadListener="#{bean.upload}" auto="true" /> // for PrimeFaces >= 8.x this should be listener instead of fileUploadListener
</h:form>
public void upload(FileUploadEvent event) {
UploadedFile uploadedFile = event.getFile();
String fileName = uploadedFile.getFileName();
String contentType = uploadedFile.getContentType();
byte[] contents = uploadedFile.getContents(); // Or getInputStream()
// ... Save it, now!
}
Veya ajax dışı dosya yüklemek istiyorsanız:
<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(); // Or getInputStream()
// ... Save it, now!
}
Gibi ajax ilgili özelliklerin o notu mı auto
, allowTypes
, update
, onstart
, oncomplete
, vb edilir ihmal içinde mode="simple"
. Yani böyle bir durumda bunları belirtmeye gerek yok.
Ayrıca , daha sonraki bir HTTP isteği tarafından başlatılan farklı bir Bean yönteminde değil, yukarıda belirtilen yöntemlerin hemen içindeki dosya içeriğini okumanız gerektiğini unutmayın . Bunun nedeni, yüklenen dosya içeriğinin istek kapsamlı olması ve dolayısıyla daha sonraki / farklı bir HTTP isteğinde kullanılamamasıdır. Daha sonraki bir talepte okumaya yönelik herhangi bir girişim, büyük olasılıkla java.io.FileNotFoundException
geçici dosyada sonuçlanacaktır .
PrimeFaces 8.x
Yapılandırma aşağıdaki 5.x sürüm bilgisiyle aynıdır, ancak dinleyiciniz çağrılmazsa, öznitelik çağrılıp çağrılmadığını kontrol edin listener
(8.x öncesi sürümlerde olduğu gibi)fileUploadListener
PrimeFaces 5.x
JSF 2.2 kullanıyorsanız ve sizin faces-config.xml
de JSF 2.2 sürümüne uygun olduğu bildirilmişse, bu herhangi bir ek yapılandırma gerektirmez . PrimeFaces dosya yükleme filtresine hiç ihtiyacınız yoktur. Kullanılan hedef sunucuya bağlı olarak JSF'yi nasıl doğru bir şekilde kurup yapılandıracağınız konusunda net değilseniz, JSF kitaplıkları Maven aracılığıyla nasıl düzgün şekilde kurulur ve yapılandırılır? ve JSF wiki sayfamızın "JSF Kurulumu" bölümü .
Ancak henüz JSF 2.2 kullanmıyorsanız ve yükseltemiyorsanız (zaten Servlet 3.0 uyumlu bir konteyner üzerindeyken zahmetsiz olmalıdır), aşağıdaki PrimeFaces dosya yükleme filtresini manuel olarak kaydetmeniz gerekir web.xml
(çoklu parça isteği ve normal istek parametre haritasını doldurun, böylece FacesServlet
her zamanki gibi çalışmaya devam edebilir):
<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>
<servlet-name>
Değeri facesServlet
tam olarak değerle aynı olmalıdır <servlet>
girişinde javax.faces.webapp.FacesServlet
aynı yer web.xml
. Öyleyse örneğin ise Faces Servlet
, eşleşecek şekilde düzenlemeniz gerekir.
PrimeFaces 4.x
PrimeFaces 5.x ile aynı hikaye 4.x için de geçerlidir.
Yalnızca yüklenen dosya içeriğinin tarihine kadar alınmasında olası bir sorun var UploadedFile#getContents()
. Bu null
, Apache Commons FileUpload yerine yerel API kullanıldığında geri dönecektir . Bunun UploadedFile#getInputStream()
yerine kullanmanız gerekir . Ayrıca bkz. MySQL'de p: fileUpload'dan BLOB olarak yüklenen görüntü nasıl eklenir?
Yerel API ile ilgili diğer bir olası sorun, yükleme bileşeninin, yükleme bileşenini işlemeyen farklı bir "normal" ajax isteğinin tetiklendiği bir formda mevcut olmasıdır. Ayrıca bkz. Dosya yükleme, PrimeFaces 4.0 / JSF 2.2.x'te AJAX ile çalışmıyor - javax.servlet.ServletException: İstek içerik türü çok parçalı / form verisi değil .
Her iki sorun da Apache Commons FileUpload'a geçilerek çözülebilir. Ayrıntılı bilgi için PrimeFaces 3.x bölümüne bakın.
PrimeFaces 3.x
Bu sürüm JSF 2.2 / Servlet 3.0 yerel dosya yüklemesini desteklemez. Apache Commons FileUpload'u manuel olarak yüklemeniz ve dosya yükleme filtresini içinde açıkça kaydetmeniz gerekir web.xml
.
Aşağıdaki kitaplıklara ihtiyacınız var:
Bunlar web uygulamasının çalışma zamanı sınıf yolunda mevcut olmalıdır. Maven'i kullanırken, en azından çalışma zamanı kapsamlı olduklarından emin olun (varsayılan derleme kapsamı da iyidir). JAR'ları elle taşırken, /WEB-INF/lib
klasörde son bulduklarından emin olun .
Dosya yükleme filtresi kayıt ayrıntıları, yukarıdaki PrimeFaces 5.x bölümünde bulunabilir. PrimeFaces 4+ kullanıyorsanız ve JSF 2.2 / Servlet 3.0 yerel dosya yüklemesi yerine Apache Commons FileUpload kullanmak istiyorsanız, söz konusu kitaplıkların yanında ve aşağıdaki bağlam parametresini de filtrelemeniz gerekir 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 çalışmıyorsa, PrimeFaces yapılandırmasıyla ilgili olmayan başka olası nedenler şunlardır:
Eğer PrimeFaces dosya yükleme filtre kullanıyorsanız Sadece eğer: bir tane daha var Filter
çalıştığı için webapp önce PrimeFaces dosya yükleme filtre ve zaten örneğin arayarak istek gövdesini tükettiği getParameter()
, getParameterMap()
, getReader()
, vesaire. Bir istek gövdesi yalnızca bir kez ayrıştırılabilir. Dosya yükleme filtresi işini yapmadan önce bu yöntemlerden birini çağırdığınızda, dosya yükleme filtresi boş bir istek gövdesi alır.
Bunu düzeltmek için <filter-mapping>
, dosya yükleme filtresini diğer filtreden önce yerleştirmeniz gerekir web.xml
. İstek bir multipart/form-data
istek değilse , dosya yükleme filtresi hiçbir şey olmamış gibi devam edecektir. Ek açıklamalar kullandıkları için otomatik olarak eklenen filtreler kullanırsanız (örn. PrettyFaces), web.xml aracılığıyla açık sıralama eklemeniz gerekebilir. WAR'da ek açıklamaları kullanarak yürütme için servlet filtre sırasını tanımlama bölümüne bakın.
Yalnızca PrimeFaces dosya yükleme filtresini kullanıyorsanız: Web uygulamanızda PrimeFaces dosya yükleme filtresinden önceFilter
çalışan ve bir arama gerçekleştiren başka bir uygulama vardır . PrettyFaces gibi URL yeniden yazma filtreleri bunu genellikle yapar. Bu, dağıtıcıyı tetikler , ancak filtreler varsayılan olarak yalnızca dağıtıcıda dinler .RequestDispatcher#forward()
FORWARD
REQUEST
Bunu düzeltmek için, PrimeFaces dosya yükleme filtresini yönlendirme filtresinin önüne koymanız veya FORWARD
dağıtıcıda dinlemek için PrimeFaces dosya yükleme filtresini yeniden yapılandırmanız gerekir :
<filter-mapping>
<filter-name>primeFacesFileUploadFilter</filter-name>
<servlet-name>facesServlet</servlet-name>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
İç içe bir var <h:form>
. Bu HTML'de yasa dışıdır ve tarayıcı davranışı belirtilmemiştir. Çoğu zaman, tarayıcı gönderildiğinde beklenen verileri göndermez. Yuvalanmadığınızdan emin olun <h:form>
. Bu tamamen formdan bağımsızdır enctype
. Sadece formları hiç iç içe geçirmeyin.
Hala sorun yaşıyorsanız, HTTP trafiğinde hata ayıklayın. Web tarayıcısının geliştirici araç setini açın (Chrome / Firebug23 + / IE9 + 'da F12'ye basın) ve Net / Network bölümünü kontrol edin. HTTP kısmı iyi görünüyorsa, JSF kodunda hata ayıklayın. Bir kesme noktası koyun FileUploadRenderer#decode()
ve oradan ilerleyin.
Yüklenen dosyayı kaydetme
Sonunda onu çalıştırdıktan sonra, sonraki sorunuz muhtemelen "Yüklenen dosyayı nasıl / nereye kaydederim?" Gibi olacaktır. Peki, buradan devam edin: Yüklenen dosya JSF'ye nasıl kaydedilir .
web.xml
, PrimeFaces Kullanıcı Kılavuzuna göre PrimeFaces yükleme filtresini kaydetmemiş olmanız olabilir . Yine de okudun mu? Ancak bu, nedenmode="simple"
sizin için işe yaradığını açıklamaz .