{"id":31546,"date":"2025-10-11T04:41:55","date_gmt":"2025-10-11T01:41:55","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31546"},"modified":"2025-10-11T04:41:55","modified_gmt":"2025-10-11T01:41:55","slug":"primefaces-fileupload-component-example-tutorial","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/","title":{"rendered":"Primefaces FileUpload Component Example Tutorial"},"content":{"rendered":"<p><body><\/p>\n<p>Web uygulamalar\u0131nda dosya y\u00fckleme, kullan\u0131c\u0131lar\u0131n belge, resim veya di\u011fer medya t\u00fcrlerini sunucuya g\u00f6ndermelerini sa\u011flayan temel bir i\u015flevdir. PrimeFaces, JSF tabanl\u0131 uygulamalar i\u00e7in bu s\u00fcreci kolayla\u015ft\u0131ran g\u00fc\u00e7l\u00fc ve esnek bir <code>fileUpload<\/code> bile\u015feni sunar. Bu rehberde, PrimeFaces FileUpload bile\u015fenini detayl\u0131 bir \u015fekilde inceleyecek, temelden ba\u015flayarak geli\u015fmi\u015f \u00f6zelliklerine kadar t\u00fcm y\u00f6nlerini pratik \u00f6rneklerle ele alaca\u011f\u0131z.<\/p>\n<h3>PrimeFaces FileUpload Bile\u015feni Nedir ve Neden Kullanmal\u0131y\u0131z?<\/h3>\n<p>PrimeFaces FileUpload bile\u015feni, web uygulamalar\u0131n\u0131za dosya y\u00fckleme yetene\u011fi eklemek i\u00e7in tasarlanm\u0131\u015f zengin \u00f6zelliklere sahip bir aray\u00fczd\u00fcr. Geleneksel HTML formlar\u0131 arac\u0131l\u0131\u011f\u0131yla dosya y\u00fcklemek genellikle sayfa yenileme gerektirirken ve kullan\u0131c\u0131 deneyimini olumsuz etkilerken, PrimeFaces&#8217;\u0131n bu bile\u015feni AJAX tabanl\u0131 \u00e7al\u0131\u015farak kesintisiz bir deneyim sunar. Bu sayede, kullan\u0131c\u0131lar dosya y\u00fcklerken sayfan\u0131n di\u011fer b\u00f6l\u00fcmleriyle etkile\u015fime devam edebilirler.<\/p>\n<p>Neden PrimeFaces FileUpload kullanmal\u0131y\u0131z?<\/p>\n<ul>\n<li><strong>AJAX Deste\u011fi:<\/strong> Dosyalar sayfa yenilemesi olmadan arka planda y\u00fcklenir.<\/li>\n<li><strong>\u0130lerleme \u00c7ubu\u011fu:<\/strong> Y\u00fckleme s\u00fcrecini g\u00f6rsel olarak takip edebilmeyi sa\u011flar, kullan\u0131c\u0131ya geri bildirim sunar.<\/li>\n<li><strong>\u00c7oklu Dosya Y\u00fckleme:<\/strong> Tek seferde birden fazla dosyan\u0131n se\u00e7ilip y\u00fcklenebilmesine olanak tan\u0131r.<\/li>\n<li><strong>S\u00fcr\u00fckle-B\u0131rak (Drag &#038; Drop) Deste\u011fi:<\/strong> Kullan\u0131c\u0131lar\u0131n dosyalar\u0131 do\u011frudan y\u00fckleme alan\u0131na s\u00fcr\u00fckleyip b\u0131rakarak kolayca y\u00fcklemesini sa\u011flar.<\/li>\n<li><strong>Dosya Filtreleme ve Boyut Kontrol\u00fc:<\/strong> Belirli dosya t\u00fcrlerine veya boyutlar\u0131na g\u00f6re y\u00fcklemeyi k\u0131s\u0131tlayabilirsiniz.<\/li>\n<li><strong>Kolay Entegrasyon:<\/strong> JSF ve PrimeFaces ekosistemine sorunsuz bir \u015fekilde entegre olur.<\/li>\n<\/ul>\n<p>Ba\u015flamadan \u00f6nce, PrimeFaces FileUpload bile\u015feninin do\u011fru \u015fekilde \u00e7al\u0131\u015fabilmesi i\u00e7in uygulaman\u0131za Apache Commons FileUpload ve Apache Commons IO k\u00fct\u00fcphanelerini eklemeniz gerekti\u011fini unutmay\u0131n. Bu k\u00fct\u00fcphaneler, dosya y\u00fckleme verilerini ayr\u0131\u015ft\u0131rmak ve i\u015flemek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h3>Temel Kurulum ve Kullan\u0131m<\/h3>\n<p>PrimeFaces FileUpload bile\u015fenini kullanmaya ba\u015flamak i\u00e7in \u00f6ncelikle gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 projenize eklemelisiniz. Maven tabanl\u0131 bir proje kullan\u0131yorsan\u0131z, <code>pom.xml<\/code> dosyan\u0131za a\u015fa\u011f\u0131daki ba\u011f\u0131ml\u0131l\u0131klar\u0131 ekleyin:<\/p>\n<pre><code class=\"language-xml\"><dependency>\n    <groupId>commons-fileupload<\/groupId>\n    <artifactId>commons-fileupload<\/artifactId>\n    <version>1.5<\/version> <!-- G\u00fcncel versiyonu kontrol edin -->\n<\/dependency<\n<dependency>\n    <groupId>commons-io<\/groupId>\n    <artifactId>commons-io<\/artifactId>\n    <version>2.15.1<\/version> <!-- G\u00fcncel versiyonu kontrol edin -->\n<\/dependency>\n<\/code><\/pre>\n<p>Bu ba\u011f\u0131ml\u0131l\u0131klar\u0131 ekledikten sonra, PrimeFaces FileUpload bile\u015fenini XHTML sayfan\u0131zda kullanmaya ba\u015flayabilirsiniz. Temel bir dosya y\u00fckleme \u00f6rne\u011fi a\u015fa\u011f\u0131daki gibidir:<\/p>\n<pre><code class=\"language-html\"><h2>Temel Dosya Y\u00fckleme \u00d6rne\u011fi<\/h2>\n<h:form enctype=\"multipart\/form-data\">\n    <p:fileUpload value=\"#{fileUploadBean.uploadedFile}\" mode=\"simple\" \/>\n    <p:commandButton value=\"Y\u00fckle\" action=\"#{fileUploadBean.upload}\" ajax=\"false\" \/>\n<\/h:form>\n<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte <code>mode=\"simple\"<\/code> kullan\u0131lm\u0131\u015ft\u0131r. Bu mod, geleneksel bir dosya se\u00e7me d\u00fc\u011fmesi ve ek bir y\u00fckleme d\u00fc\u011fmesi sunar. Dosya y\u00fcklendikten sonra sayfan\u0131n tamam\u0131 yenilenir (<code>ajax=\"false\"<\/code> nedeniyle).<\/p>\n<p>\u015eimdi bu dosya y\u00fckleme i\u015flemini y\u00f6netecek bir Managed Bean olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-java\">import org.primefaces.model.file.UploadedFile;\nimport jakarta.faces.application.FacesMessage;\nimport jakarta.faces.context.FacesContext;\nimport jakarta.faces.view.ViewScoped;\nimport jakarta.inject.Named;\nimport java.io.Serializable;\nimport java.io.IOException;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\n\n@Named\n@ViewScoped\npublic class FileUploadBean implements Serializable {\n\n    private UploadedFile uploadedFile;\n\n    public UploadedFile getUploadedFile() {\n        return uploadedFile;\n    }\n\n    public void setUploadedFile(UploadedFile uploadedFile) {\n        this.uploadedFile = uploadedFile;\n    }\n\n    public void upload() {\n        if (uploadedFile != null) {\n            try {\n                \/\/ Dosyay\u0131 sunucuda bir yere kaydetme (\u00f6rnek: ge\u00e7ici dizin)\n                Path uploadDir = Paths.get(System.getProperty(\"java.io.tmpdir\"), \"uploads\");\n                if (!Files.exists(uploadDir)) {\n                    Files.createDirectories(uploadDir);\n                }\n                Path filePath = uploadDir.resolve(uploadedFile.getFileName());\n                Files.copy(uploadedFile.getInputStream(), filePath);\n\n                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,\n                        \"Ba\u015far\u0131l\u0131\", uploadedFile.getFileName() + \" ba\u015far\u0131yla y\u00fcklendi. Boyut: \" + uploadedFile.getSize() + \" byte.\"));\n            } catch (IOException e) {\n                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,\n                        \"Hata\", \"Dosya y\u00fcklenirken bir hata olu\u015ftu: \" + e.getMessage()));\n                e.printStackTrace();\n            }\n        } else {\n            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,\n                    \"Uyar\u0131\", \"L\u00fctfen y\u00fcklenecek bir dosya se\u00e7in.\"));\n        }\n    }\n}\n<\/code><\/pre>\n<p>Bu \u00f6rnek, se\u00e7ilen dosyay\u0131 sunucudaki ge\u00e7ici bir dizine kaydeder ve kullan\u0131c\u0131ya bir bildirim mesaj\u0131 g\u00f6sterir. Ger\u00e7ek uygulamalarda dosyalar\u0131 kal\u0131c\u0131 bir konuma kaydetmeniz ve g\u00fcvenlik \u00f6nlemlerini alman\u0131z \u00f6nemlidir.<\/p>\n<h3>Geli\u015fmi\u015f \u00d6zellikler ve Konfig\u00fcrasyonlar<\/h3>\n<p>PrimeFaces FileUpload bile\u015feni, daha zengin bir kullan\u0131c\u0131 deneyimi sunmak i\u00e7in bir\u00e7ok geli\u015fmi\u015f \u00f6zelli\u011fe sahiptir. <code>mode=\"advanced\"<\/code> kullanarak bu \u00f6zelliklerin \u00e7o\u011funu aktif edebilirsiniz:<\/p>\n<pre><code class=\"language-html\"><h2>Geli\u015fmi\u015f Dosya Y\u00fckleme \u00d6rne\u011fi<\/h2>\n<h:form enctype=\"multipart\/form-data\">\n    <p:growl id=\"messages\" showDetail=\"true\" \/>\n    <p:fileUpload fileUploadListener=\"#{fileUploadBean.handleFileUpload}\"\n                  mode=\"advanced\" dragDropSupport=\"true\"\n                  multiple=\"true\" allowTypes=\"\/(\\.|\\\/)(gif|jpe?g|png)$\/\"\n                  maxFileSize=\"1048576\" label=\"Dosya Se\u00e7...\"\n                  uploadLabel=\"Y\u00fckle\" cancelLabel=\"\u0130ptal Et\" \/>\n<\/h:form>\n<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte kullan\u0131lan baz\u0131 \u00f6nemli \u00f6zellikler:<\/p>\n<ul>\n<li><code>mode=\"advanced\"<\/code>: AJAX tabanl\u0131 y\u00fckleme, ilerleme \u00e7ubu\u011fu ve geli\u015fmi\u015f UI sa\u011flar.<\/li>\n<li><code>fileUploadListener=\"#{fileUploadBean.handleFileUpload}\"<\/code>: Dosya y\u00fcklendi\u011finde tetiklenecek metodun Managed Bean&#8217;deki ad\u0131n\u0131 belirtir. Bu metod <code>FileUploadEvent<\/code> tipinde bir parametre almal\u0131d\u0131r.<\/li>\n<li><code>dragDropSupport=\"true\"<\/code>: Kullan\u0131c\u0131lar\u0131n dosyalar\u0131 s\u00fcr\u00fckle-b\u0131rak y\u00f6ntemiyle y\u00fcklemesine olanak tan\u0131r.<\/li>\n<li><code>multiple=\"true\"<\/code>: Tek seferde birden fazla dosya se\u00e7imine izin verir.<\/li>\n<li><code>allowTypes=\"\/(\\.|\\\/)(gif|jpe?g|png)$\/\"<\/code>: Yaln\u0131zca GIF, JPEG ve PNG uzant\u0131l\u0131 dosyalar\u0131n y\u00fcklenmesine izin veren bir regex kal\u0131b\u0131.<\/li>\n<li><code>maxFileSize=\"1048576\"<\/code>: Y\u00fcklenebilecek maksimum dosya boyutunu byte cinsinden belirtir (burada 1MB).<\/li>\n<li><code>label<\/code>, <code>uploadLabel<\/code>, <code>cancelLabel<\/code>: Bile\u015fenin d\u00fc\u011fme etiketlerini \u00f6zelle\u015ftirmenizi sa\u011flar.<\/li>\n<\/ul>\n<p>Managed Bean taraf\u0131nda <code>fileUploadListener<\/code> i\u00e7in metodu g\u00fcncelleyelim:<\/p>\n<pre><code class=\"language-java\">import org.primefaces.event.FileUploadEvent;\nimport org.primefaces.model.file.UploadedFile;\n\/\/ ... di\u011fer importlar\n\n@Named\n@ViewScoped\npublic class FileUploadBean implements Serializable {\n\n    \/\/ ... uploadedFile getter\/setter (multiple i\u00e7in art\u0131k do\u011frudan kullan\u0131lmayabilir)\n\n    public void handleFileUpload(FileUploadEvent event) {\n        UploadedFile file = event.getFile();\n        if (file != null) {\n            try {\n                \/\/ Dosyay\u0131 sunucuda bir yere kaydetme\n                Path uploadDir = Paths.get(System.getProperty(\"java.io.tmpdir\"), \"uploads\");\n                if (!Files.exists(uploadDir)) {\n                    Files.createDirectories(uploadDir);\n                }\n                Path filePath = uploadDir.resolve(file.getFileName());\n                Files.copy(file.getInputStream(), filePath);\n\n                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,\n                        \"Ba\u015far\u0131l\u0131\", file.getFileName() + \" ba\u015far\u0131yla y\u00fcklendi. Boyut: \" + file.getSize() + \" byte.\"));\n            } catch (IOException e) {\n                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,\n                        \"Hata\", \"Dosya y\u00fcklenirken bir hata olu\u015ftu: \" + e.getMessage()));\n                e.printStackTrace();\n            }\n        }\n    }\n}\n<\/code><\/pre>\n<p><code>auto=\"true\"<\/code> niteli\u011fini ekleyerek, kullan\u0131c\u0131 dosya se\u00e7er se\u00e7mez otomatik olarak y\u00fckleme i\u015flemini ba\u015flatabilirsiniz. Bu, \u00f6zellikle tek bir dosya y\u00fcklemesi beklenen senaryolarda kullan\u0131c\u0131 deneyimini iyile\u015ftirir.<\/p>\n<h3>Y\u00fcklenen Dosyalar\u0131 Sunucuda Y\u00f6netme<\/h3>\n<p>Dosyalar\u0131 sunucuya y\u00fcklemek sadece ilk ad\u0131md\u0131r. Y\u00fcklenen dosyalar\u0131 g\u00fcvenli ve d\u00fczenli bir \u015fekilde y\u00f6netmek, uygulaman\u0131z\u0131n kararl\u0131l\u0131\u011f\u0131 ve g\u00fcvenli\u011fi i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p><strong>1. Kal\u0131c\u0131 Bir Konum Belirleme:<\/strong> Ge\u00e7ici dizinler yerine, uygulaman\u0131z\u0131n ihtiya\u00e7lar\u0131na g\u00f6re belirli bir dizin yap\u0131s\u0131 olu\u015fturun. \u00d6rne\u011fin, kullan\u0131c\u0131 ID&#8217;sine g\u00f6re dizinler veya kategoriye g\u00f6re dizinler olu\u015fturabilirsiniz. Genellikle, web uygulamas\u0131n\u0131n d\u0131\u015f\u0131ndaki (ancak sunucunun eri\u015febilece\u011fi) bir dizin tercih edilir. Bu, uygulaman\u0131z\u0131n yeniden da\u011f\u0131t\u0131m\u0131nda dosyalar\u0131n kaybolmamas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-java\">import jakarta.servlet.ServletContext;\n\/\/ ... di\u011fer importlar\n\npublic void handleFileUpload(FileUploadEvent event) {\n    UploadedFile file = event.getFile();\n    if (file != null) {\n        try {\n            ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();\n            String uploadPath = servletContext.getRealPath(\"\") + \"\/resources\/uploads\/\"; \/\/ \u00d6rnek: Web uygulamas\u0131n\u0131n alt\u0131ndaki bir klas\u00f6r\n            \/\/ Veya harici bir klas\u00f6r: String uploadPath = \"\/var\/www\/uploads\/\";\n\n            Path uploadDir = Paths.get(uploadPath);\n            if (!Files.exists(uploadDir)) {\n                Files.createDirectories(uploadDir);\n            }\n\n            \/\/ Dosya ad\u0131n\u0131 g\u00fcvenli hale getirme ve benzersiz yapma\n            String originalFileName = file.getFileName();\n            String fileExtension = originalFileName.substring(originalFileName.lastIndexOf(\".\"));\n            String uniqueFileName = System.currentTimeMillis() + \"_\" + Math.abs(originalFileName.hashCode()) + fileExtension;\n\n            Path filePath = uploadDir.resolve(uniqueFileName);\n            Files.copy(file.getInputStream(), filePath);\n\n            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,\n                    \"Ba\u015far\u0131l\u0131\", originalFileName + \" ba\u015far\u0131yla y\u00fcklendi. Sunucudaki ad\u0131: \" + uniqueFileName));\n\n            \/\/ Veritaban\u0131na dosya bilgilerini kaydetme (uniqueFileName, originalFileName, filePath, userId vb.)\n            \/\/ ...\n        } catch (IOException e) {\n            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,\n                    \"Hata\", \"Dosya y\u00fcklenirken bir hata olu\u015ftu: \" + e.getMessage()));\n            e.printStackTrace();\n        }\n    }\n}\n<\/code><\/pre>\n<p><strong>2. Benzersiz Dosya Adlar\u0131:<\/strong> Ayn\u0131 isme sahip dosyalar\u0131n birbirinin \u00fczerine yazmas\u0131n\u0131 \u00f6nlemek i\u00e7in benzersiz dosya adlar\u0131 olu\u015fturun (\u00f6rne\u011fin, zaman damgas\u0131 veya UUID kullanarak). Yukar\u0131daki \u00f6rnekte <code>System.currentTimeMillis() + \"_\" + Math.abs(originalFileName.hashCode()) + fileExtension<\/code> kombinasyonu kullan\u0131lm\u0131\u015ft\u0131r.<\/p>\n<p><strong>3. G\u00fcvenlik ve Do\u011frulama:<\/strong><\/p>\n<ul>\n<li><strong>Dosya T\u00fcr\u00fc Do\u011frulama:<\/strong> <code>allowTypes<\/code> ile frontend&#8217;de k\u0131s\u0131tlama yapsan\u0131z bile, backend&#8217;de de dosya uzant\u0131s\u0131n\u0131 ve MIME t\u00fcr\u00fcn\u00fc kontrol edin.<\/li>\n<li><strong>Boyut Do\u011frulama:<\/strong> <code>maxFileSize<\/code> ile frontend&#8217;de k\u0131s\u0131tlama yapsan\u0131z bile, backend&#8217;de de dosya boyutunu kontrol edin.<\/li>\n<li><strong>Zararl\u0131 \u0130\u00e7erik Taramas\u0131:<\/strong> \u00d6zellikle kullan\u0131c\u0131lar\u0131n y\u00fckledi\u011fi dosyalar\u0131 ba\u015fka kullan\u0131c\u0131lar\u0131n g\u00f6r\u00fcnt\u00fcleyebilece\u011fi durumlarda, bir vir\u00fcs taray\u0131c\u0131 entegrasyonu d\u00fc\u015f\u00fcn\u00fcn.<\/li>\n<li><strong>Y\u00fcr\u00fct\u00fclebilir Dosyalar\u0131 Engelleme:<\/strong> Sunucuda \u00e7al\u0131\u015ft\u0131r\u0131labilecek dosya t\u00fcrlerinin (\u00f6rn. <code>.exe<\/code>, <code>.sh<\/code>, <code>.php<\/code>) y\u00fcklenmesini kesinlikle engelleyin.<\/li>\n<li><strong>Dizin Yolu Ge\u00e7i\u015fi (Path Traversal) Sald\u0131r\u0131lar\u0131n\u0131 \u00d6nleme:<\/strong> Dosya adlar\u0131n\u0131n sadece dosya ad\u0131n\u0131 i\u00e7erdi\u011finden ve dizin yollar\u0131 i\u00e7ermedi\u011finden emin olun.<\/li>\n<\/ul>\n<h3>Pratik \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar<\/h3>\n<ul>\n<li><strong>Kullan\u0131c\u0131 Geri Bildirimi:<\/strong> Dosya y\u00fckleme i\u015fleminin durumu hakk\u0131nda kullan\u0131c\u0131ya s\u00fcrekli geri bildirim sa\u011flay\u0131n. PrimeFaces <code>p:growl<\/code> bile\u015feni, bu t\u00fcr mesajlar\u0131 g\u00f6stermek i\u00e7in idealdir.<\/li>\n<li><strong>B\u00fcy\u00fck Dosya Y\u00fcklemeleri:<\/strong> \u00c7ok b\u00fcy\u00fck dosyalar i\u00e7in sunucunuzun ve uygulaman\u0131z\u0131n timeout ayarlar\u0131n\u0131 (\u00f6rne\u011fin, web.xml&#8217;deki session timeout, sunucu yap\u0131land\u0131rmas\u0131ndaki request timeout) g\u00f6zden ge\u00e7irin. Gerekirse, dosyalar\u0131 par\u00e7alar halinde y\u00fckleme (chunked upload) gibi daha geli\u015fmi\u015f teknikleri ara\u015ft\u0131r\u0131n (PrimeFaces bu seviyede do\u011frudan desteklemez, ancak entegrasyonlar m\u00fcmk\u00fcnd\u00fcr).<\/li>\n<li><strong>Veritaban\u0131 Entegrasyonu:<\/strong> Genellikle dosyalar\u0131n kendisini veritaban\u0131na kaydetmek yerine, dosya yolunu, ad\u0131n\u0131, boyutunu, MIME t\u00fcr\u00fcn\u00fc ve y\u00fckleyen kullan\u0131c\u0131 bilgilerini veritaban\u0131na kaydetmek daha iyi bir yakla\u015f\u0131md\u0131r. Dosyalar dosya sisteminde kal\u0131r.<\/li>\n<li><strong>Temizlik Mekanizmalar\u0131:<\/strong> Ba\u015far\u0131s\u0131z olan veya iptal edilen y\u00fcklemelerden kalan ge\u00e7ici dosyalar\u0131 temizlemek i\u00e7in bir mekanizma olu\u015fturun.<\/li>\n<li><strong>Hata Y\u00f6netimi:<\/strong> Dosya y\u00fckleme s\u0131ras\u0131nda olu\u015fabilecek t\u00fcm hatalar\u0131 (disk alan\u0131 yetersizli\u011fi, izin sorunlar\u0131, a\u011f kesintileri vb.) uygun \u015fekilde yakalay\u0131n ve kullan\u0131c\u0131ya anla\u015f\u0131l\u0131r mesajlar sunun.<\/li>\n<li><strong>Asenkron \u0130\u015fleme:<\/strong> \u00c7ok b\u00fcy\u00fck dosyalar i\u00e7in, dosya y\u00fcklemesi tamamland\u0131ktan sonra dosya i\u015fleme (\u00f6rn. resim boyutland\u0131rma, OCR) gibi yo\u011fun i\u015flemleri ayr\u0131 bir i\u015f par\u00e7ac\u0131\u011f\u0131nda veya kuyruk sisteminde (\u00f6rn. JMS, Kafka) asenkron olarak yapmay\u0131 d\u00fc\u015f\u00fcn\u00fcn. Bu, web sunucusunun ana i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131n bloklanmas\u0131n\u0131 \u00f6nler ve kullan\u0131c\u0131 deneyimini iyile\u015ftirir.<\/li>\n<li><strong>CDN Kullan\u0131m\u0131:<\/strong> E\u011fer uygulaman\u0131z \u00e7ok say\u0131da dosya bar\u0131nd\u0131racak ve bu dosyalara d\u00fcnya genelinden eri\u015fim sa\u011flanacaksa, y\u00fcklenen dosyalar\u0131 bir \u0130\u00e7erik Da\u011f\u0131t\u0131m A\u011f\u0131&#8217;na (CDN) ta\u015f\u0131may\u0131 d\u00fc\u015f\u00fcnebilirsiniz.<\/li>\n<\/ul>\n<h3>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p>PrimeFaces FileUpload bile\u015feni, web uygulamalar\u0131n\u0131za g\u00fc\u00e7l\u00fc, esnek ve kullan\u0131c\u0131 dostu bir dosya y\u00fckleme yetene\u011fi kazand\u0131rmak i\u00e7in m\u00fckemmel bir ara\u00e7t\u0131r. Temel kurulumdan ba\u015flayarak geli\u015fmi\u015f \u00f6zelliklerine ve g\u00fcvenlik ipu\u00e7lar\u0131na kadar geni\u015f bir yelpazede ele ald\u0131\u011f\u0131m\u0131z bu rehberle, kendi uygulamalar\u0131n\u0131zda ba\u015far\u0131l\u0131 dosya y\u00fckleme mekanizmalar\u0131 olu\u015fturabilirsiniz. Unutmay\u0131n ki, g\u00fcvenlik ve performans her zaman \u00f6ncelikli olmal\u0131d\u0131r.<\/p>\n<h4>SSS (S\u0131k\u00e7a Sorulan Sorular)<\/h4>\n<p><strong>1. PrimeFaces FileUpload neden \u00e7al\u0131\u015fm\u0131yor?<\/strong><\/p>\n<ul>\n<li><strong>Ba\u011f\u0131ml\u0131l\u0131klar:<\/strong> <code>commons-fileupload<\/code> ve <code>commons-io<\/code> Maven\/Gradle ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 ekledi\u011finizden emin olun.<\/li>\n<li><strong><code>enctype=\"multipart\/form-data\"<\/code>:<\/strong> Dosya y\u00fckleme formunuzun <code><h:form><\/code> etiketinde bu niteli\u011fin bulundu\u011fundan emin olun.<\/li>\n<li><strong>Sunucu Konfig\u00fcrasyonu:<\/strong> Sunucunuzun (Tomcat, WildFly vb.) dosya y\u00fckleme boyut limitlerini kontrol edin. Varsay\u0131lan limitler k\u00fc\u00e7\u00fck olabilir.<\/li>\n<li><strong>Managed Bean Kapsam\u0131:<\/strong> Managed Bean&#8217;inizin do\u011fru kapsamda (\u00f6rne\u011fin <code>@ViewScoped<\/code> veya <code>@SessionScoped<\/code>) oldu\u011fundan emin olun.<\/li>\n<li><strong>JSF Versiyonu:<\/strong> Kulland\u0131\u011f\u0131n\u0131z PrimeFaces ve JSF versiyonlar\u0131n\u0131n uyumlu oldu\u011fundan emin olun.<\/li>\n<\/ul>\n<p><strong>2. B\u00fcy\u00fck dosyalar\u0131 nas\u0131l y\u00fcklerim?<\/strong><\/p>\n<ul>\n<li><code>p:fileUpload<\/code> bile\u015feninin <code>maxFileSize<\/code> niteli\u011fini art\u0131r\u0131n.<\/li>\n<li>Sunucunuzun (\u00f6rne\u011fin Tomcat&#8217;in <code>server.xml<\/code> dosyas\u0131ndaki <code>maxPostSize<\/code> veya <code>maxSwallowSize<\/code> gibi) dosya y\u00fckleme limitlerini art\u0131r\u0131n.<\/li>\n<li><code>web.xml<\/code> dosyan\u0131zda <code><multipart-config><\/code> ayarlar\u0131n\u0131 kullanarak dosya boyut limitlerini belirleyebilirsiniz.<\/li>\n<li>A\u011f ba\u011flant\u0131s\u0131 ve sunucu kaynaklar\u0131 yeterli olmal\u0131d\u0131r.<\/li>\n<\/ul>\n<p><strong>3. Y\u00fcklenen dosyalar\u0131 g\u00fcvenli bir \u015fekilde nas\u0131l saklar\u0131m?<\/strong><\/p>\n<ul>\n<li>Dosyalar\u0131 web uygulamas\u0131n\u0131n d\u0131\u015f\u0131ndaki, ancak sunucunun eri\u015febilece\u011fi bir dizine kaydedin.<\/li>\n<li>Benzersiz dosya adlar\u0131 olu\u015fturun (UUID, zaman damgas\u0131 vb.) \u00e7ak\u0131\u015fmalar\u0131 \u00f6nlemek i\u00e7in.<\/li>\n<li>Y\u00fcklenen dosya t\u00fcrlerini ve boyutlar\u0131n\u0131 hem frontend hem de backend&#8217;de do\u011frulay\u0131n.<\/li>\n<li>Y\u00fcr\u00fct\u00fclebilir dosya t\u00fcrlerinin y\u00fcklenmesini engelleyin.<\/li>\n<li>Dosya adlar\u0131nda dizin yolu ge\u00e7i\u015fini engelleyin (\u00f6rne\u011fin <code>..\/..\/<\/code> gibi ifadeleri temizleyin).<\/li>\n<\/ul>\n<p><strong>4. Birden fazla dosya y\u00fckleme nas\u0131l yap\u0131l\u0131r?<\/strong><\/p>\n<ul>\n<li><code><p:fileUpload><\/code> bile\u015fenine <code>multiple=\"true\"<\/code> niteli\u011fini ekleyin.<\/li>\n<li><code>fileUploadListener<\/code> metodunuzun <code>FileUploadEvent<\/code> parametresini kullanarak her bir dosyay\u0131 ayr\u0131 ayr\u0131 i\u015fleyin.<\/li>\n<\/ul>\n<p><strong>5. Y\u00fckleme ilerlemesini nas\u0131l g\u00f6steririm?<\/strong><\/p>\n<ul>\n<li><code>mode=\"advanced\"<\/code> kulland\u0131\u011f\u0131n\u0131zda, PrimeFaces otomatik olarak bir ilerleme \u00e7ubu\u011fu g\u00f6sterir. Ek bir yap\u0131land\u0131rma gerektirmez.<\/li>\n<\/ul>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Web uygulamalar\u0131nda dosya y\u00fckleme, kullan\u0131c\u0131lar\u0131n belge, resim veya di\u011fer medya t\u00fcrlerini sunucuya g\u00f6ndermelerini sa\u011flayan temel bir i\u015flevdi","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-31546","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Primefaces FileUpload Component Example Tutorial - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Primefaces FileUpload Component Example Tutorial\" \/>\n<meta property=\"og:description\" content=\"Web uygulamalar\u0131nda dosya y\u00fckleme, kullan\u0131c\u0131lar\u0131n belge, resim veya di\u011fer medya t\u00fcrlerini sunucuya g\u00f6ndermelerini sa\u011flayan temel bir i\u015flevdi\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-11T01:41:55+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Primefaces FileUpload Component Example Tutorial\",\"datePublished\":\"2025-10-11T01:41:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/\"},\"wordCount\":1609,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/\",\"name\":\"Primefaces FileUpload Component Example Tutorial - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-11T01:41:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Primefaces FileUpload Component Example Tutorial\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Primefaces FileUpload Component Example Tutorial - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/","og_locale":"tr_TR","og_type":"article","og_title":"Primefaces FileUpload Component Example Tutorial","og_description":"Web uygulamalar\u0131nda dosya y\u00fckleme, kullan\u0131c\u0131lar\u0131n belge, resim veya di\u011fer medya t\u00fcrlerini sunucuya g\u00f6ndermelerini sa\u011flayan temel bir i\u015flevdi","og_url":"https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-11T01:41:55+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"2 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Primefaces FileUpload Component Example Tutorial","datePublished":"2025-10-11T01:41:55+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/"},"wordCount":1609,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/","url":"https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/","name":"Primefaces FileUpload Component Example Tutorial - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-11T01:41:55+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/primefaces-fileupload-component-example-tutorial\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Primefaces FileUpload Component Example Tutorial"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31546","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31546"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31546\/revisions"}],"predecessor-version":[{"id":31547,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31546\/revisions\/31547"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31546"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31546"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31546"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}