Friday, April 15, 2016

Upload multiple files with JSF 2.3

Leave a Comment

Based on this post Show progress percentage of h:inputFile upload I would like to create upload page with multiple files.

<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html lang="en"       xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"       xmlns:h="http://java.sun.com/jsf/html"       xmlns:f="http://xmlns.jcp.org/jsf/core">     <h:head>         <title>About</title>         <script type="text/javascript">             function progressBar(data) {                 if (data.status == "begin") {                     document.getElementById("progressBarId").style.display = "block";                 }                 else if (data.status == "complete") {                     document.getElementById("progressBarId").style.display = "none";                 }             }              function updateProgressBar(percent) {                 var emptyColor = "#cccccc";                 var progressColor = "#3333cc";                 document.getElementById("progressBarId").style.background = "linear-gradient(to right, " + progressColor + " 0%, " + progressColor + " " + percent + "%, " + emptyColor + " " + percent + "%, " + emptyColor + " 100%)";             }         </script>     </h:head>     <h:body>         <f:websocket channel="uploadProgress" scope="view" onmessage="updateProgressBar" />          <h:messages id="uploadMsgId" globalOnly="true" showDetail="false" showSummary="true" style="color:red"/>         <h:form id="uploadFormId" enctype="multipart/form-data">             <h:inputFile id="fileToUpload" required="true" requiredMessage="No file selected ..." value="#{uploadBean.file}"/>             <h:message showDetail="false" showSummary="true" for="fileToUpload" style="color:red"/>             <h:commandButton value="Upload" action="#{uploadBean.upload()}">                 <f:ajax execute="fileToUpload" onevent="progressBar" render=":uploadMsgId @form"/>             </h:commandButton>         </h:form>         <div>             <div id="progressBarId" style="display: none; width: 250px; height: 23px; border: 1px solid black;" width="250px;" height="23"/>         </div>      </h:body> </html> 

Bean:

package com.crm.web.accounts;  import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.logging.Level; import java.util.logging.Logger; import javax.enterprise.context.RequestScoped; import javax.faces.application.FacesMessage; import javax.faces.context.FacesContext; import javax.faces.push.Push; import javax.faces.push.PushContext; import javax.inject.Inject; import javax.inject.Named; import javax.servlet.http.Part;  @Named @RequestScoped public class UploadBean {     @Inject     @Push     private PushContext uploadProgress;      private static final Logger logger = Logger.getLogger(UploadBean.class.getName());     private Part file;      public Part getFile()     {         return file;     }      public void setFile(Part file)     {         this.file = file;     }      public void upload()     {          if (file != null)         {              logger.info("File Details:");             logger.log(Level.INFO, "File name:{0}", file.getName());             logger.log(Level.INFO, "Content type:{0}", file.getContentType());             logger.log(Level.INFO, "Submitted file name:{0}", file.getSubmittedFileName());             logger.log(Level.INFO, "File size:{0}", file.getSize());              try (InputStream inputStream = file.getInputStream(); FileOutputStream outputStream = new FileOutputStream("C:" + File.separator + "jsf_files_test_for_delete" + File.separator + file.getSubmittedFileName()))             {                  long lastTimestamp = System.currentTimeMillis();                 int pushInterval = 1000;                 long totalRead = 0;                 long size = file.getSize();                  int bytesRead = 0;                 final byte[] chunck = new byte[1024];                 while ((bytesRead = inputStream.read(chunck)) != -1)                 {                     outputStream.write(chunck, 0, bytesRead);                     totalRead += bytesRead;                      if (System.currentTimeMillis() > lastTimestamp + pushInterval)                     {                         lastTimestamp = System.currentTimeMillis();                         uploadProgress.send(100.0 * totalRead / size); // Make sure this isn't sent more often than once per second.                     }                 }                  FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Upload successfully ended!"));             }             catch (IOException e)             {                 FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Upload failed!"));             }         }     } } 

For example when I select a file with Browse button and click "Upload" button I would like to be able to upload several others. What is the proper way to implement this with JSF 2.3?

0 Answers

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment