Note

The bridge:inputFile component is a legacy feature of Liferay Faces Bridge. Although it has the benefit of supporting multi-file uploads, it only works in a portlet environment (not in a webapp environment).

Please consider using h:inputFile since it works in both webapp and portlet environments. However, it does not have a multi-file upload feature.

The enclosing form must have enctype="multipart/form-data"

bridge:inputFile

InputFile is a UIInput component that renders an <input> element with type="file". Since it extends HtmlInputFile, it supports all the features of h:inputFile and also supports multi-file uploads.

Multiple Usage

Multi-file upload is supported by setting the HTML5 passthrough attribute multiple=multiple.


                   

Source Code

  1. <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:bridge="http://liferay.com/faces/bridge"
  2. xmlns:h="http://xmlns.jcp.org/jsf/html"
  3. xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
  4.  
  5. <h:form enctype="multipart/form-data">
  6. <bridge:inputFile fileUploadListener="#{bridgeInputFileBackingBean.handleFileUpload}" multiple="multiple" />
  7. <hr />
  8. <h:commandButton value="#{i18n['submit']}" />
  9. <ui:include src="../bridgeInputFileCommon.xhtml" />
  10. </h:form>
  11.  
  12. </ui:composition>
  1. <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
  2. xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:h="http://xmlns.jcp.org/jsf/html"
  3. xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
  4. <c:set value="#{bridgeInputFileModelBean.uploadedFiles.size()}" var="totalFiles" />
  5. <h:dataTable id="modelValue" rendered="#{totalFiles > 0}" styleClass="files"
  6. value="#{bridgeInputFileModelBean.uploadedFiles}" var="uploadedFile">
  7. <h:column>
  8. <h:commandButton actionListener="#{bridgeInputFileBackingBean.deleteUploadedFile}"
  9. image="#{resource['images:icon-delete.png']}"
  10. onclick="if (! confirm('#{i18n['are-you-sure-you-want-to-delete-this']}')) {return false;}"
  11. value="#{uploadedFile.id}">
  12. <f:ajax render="@form" />
  13. </h:commandButton>
  14. </h:column>
  15. <h:column>
  16. <f:facet name="header">
  17. <h:outputText rendered="#{totalFiles > 0}" value="#{i18n['file-name']}" />
  18. </f:facet>
  19. <h:outputText value="#{uploadedFile.name}" />
  20. </h:column>
  21. <h:column>
  22. <f:facet name="header">
  23. <h:outputText rendered="#{totalFiles > 0}" value="#{i18n['size']}" />
  24. </f:facet>
  25. <h:outputText value="#{uploadedFile.size}" />
  26. </h:column>
  27. </h:dataTable>
  28. </ui:composition>
  1. @ViewScoped
  2. @ManagedBean
  3. public class BridgeInputFileModelBean implements Serializable {
  4.  
  5. // serialVersionUID
  6. private static final long serialVersionUID = 211172404377673109L;
  7.  
  8. // Logger
  9. private static final Logger logger = LoggerFactory.getLogger(BridgeInputFileModelBean.class);
  10.  
  11. // Private Data Members
  12. private List<UploadedFile> uploadedFiles;
  13.  
  14. public List<UploadedFile> getUploadedFiles() {
  15. return uploadedFiles;
  16. }
  17.  
  18. @PostConstruct
  19. public void postConstruct() {
  20. this.uploadedFiles = new ArrayList<UploadedFile>();
  21. }
  22.  
  23. @PreDestroy
  24. public void preDestroy() {
  25.  
  26. for (UploadedFile uploadedFile : uploadedFiles) {
  27.  
  28. try {
  29. uploadedFile.delete();
  30. }
  31. catch (IOException e) {
  32. logger.error(e);
  33. }
  34. }
  35.  
  36. uploadedFiles = null;
  37. }
  38. }
  1. @RequestScoped
  2. @ManagedBean
  3. public class BridgeInputFileBackingBean {
  4.  
  5. // Logger
  6. private static final Logger logger = LoggerFactory.getLogger(BridgeInputFileBackingBean.class);
  7.  
  8. @ManagedProperty(value = "#{bridgeInputFileModelBean}")
  9. private com.liferay.faces.bridge.demos.bean.BridgeInputFileModelBean bridgeInputFileModelBean;
  10.  
  11. public void deleteUploadedFile(ActionEvent actionEvent) {
  12.  
  13. UICommand uiCommand = (UICommand) actionEvent.getComponent();
  14. String fileId = (String) uiCommand.getValue();
  15.  
  16. try {
  17. List<UploadedFile> uploadedFiles = bridgeInputFileModelBean.getUploadedFiles();
  18.  
  19. UploadedFile uploadedFileToDelete = null;
  20.  
  21. for (UploadedFile uploadedFile : uploadedFiles) {
  22.  
  23. if (uploadedFile.getId().equals(fileId)) {
  24. uploadedFileToDelete = uploadedFile;
  25.  
  26. break;
  27. }
  28. }
  29.  
  30. if (uploadedFileToDelete != null) {
  31. uploadedFileToDelete.delete();
  32. uploadedFiles.remove(uploadedFileToDelete);
  33. logger.debug("Deleted file=[{0}]", uploadedFileToDelete.getName());
  34. }
  35. }
  36. catch (Exception e) {
  37. logger.error(e);
  38. }
  39. }
  40.  
  41. public void handleFileUpload(FileUploadEvent fileUploadEvent) {
  42.  
  43. List<UploadedFile> uploadedFiles = bridgeInputFileModelBean.getUploadedFiles();
  44. UploadedFile uploadedFile = fileUploadEvent.getUploadedFile();
  45.  
  46. if (uploadedFile.getStatus() == UploadedFile.Status.FILE_SAVED) {
  47.  
  48. FacesContext facesContext = FacesContext.getCurrentInstance();
  49. FacesMessage facesMessage = new FacesMessage("Received fileUploadEvent for file named '" +
  50. uploadedFile.getName() + "' in the " + fileUploadEvent.getPhaseId().toString() + " phase.");
  51. facesContext.addMessage(null, facesMessage);
  52. uploadedFiles.add(uploadedFile);
  53. logger.debug("Received fileName=[{0}] absolutePath=[{1}]", uploadedFile.getName(),
  54. uploadedFile.getAbsolutePath());
  55. }
  56. else {
  57. logger.error("Failed to receive uploaded file due to error status=[{0}] message=[{1}]",
  58. uploadedFile.getStatus(), uploadedFile.getMessage());
  59. }
  60. }
  61.  
  62. public void setBridgeInputFileModelBean(
  63. com.liferay.faces.bridge.demos.bean.BridgeInputFileModelBean bridgeInputFileModelBean) {
  64.  
  65. // Injected via @ManagedProperty annotation
  66. this.bridgeInputFileModelBean = bridgeInputFileModelBean;
  67. }
  68. }
Liferay Faces Bridge Implementation 5.0.0 + Showcase Common 3.1.1 + Liferay Faces Util 3.4.1 + Mojarra 2.2.20