2016-03-22 2 views
1

Mein Admin-Dashboard basiert auf Spring mit JSF 2.2 + Primefaces 5.3.Primefaces, p: imageCropper konnte das Bild nach dem Upload nicht anzeigen

I Form entwickle neue Einheiten für die Erstellung, die funktionieren sollte wie folgt:

  1. Benutzer in allen Eingabefelder ausfüllen und laden Bild (mit <p:fileUpload).
  2. Dann sollte die <p:imageCropper aktualisiert werden und angezeigt werden hochgeladen Bild zu beschneiden.
  3. Benutzer zugeschnittenes Bild, und drücken Sie die Schaltfläche Senden, um neue Entität zu erstellen und Bild auf der Festplatte zu speichern.

Jetzt steckte ich auf der 2 Schritt. Das hochgeladene Bild wird von <p:imageCropper nicht angezeigt.

Ich habe Zweifel, ob es möglich ist, das Bildattribut <p:imageCropper aus dem StreamedContent-Obj von der verwalteten Bean zu erhalten, wie für <p:graphicImage?

Also, lassen Sie mich bitte wissen, wie es gelöst werden könnte?

Hier ist meine Form:

<h:form prependId="false" id="createForm" enctype="multipart/form-data"> 
      <p:separator /> 
       <p:growl id="messages" showDetail="true" /> 
       <p:outputLabel value="Create card:" /> 
       <h:panelGrid columns="2" cellpadding="5"> 
        <p:outputLabel value="Fill in Name:" for="cardName" /> 
        <p:inputText id="cardName" value="#{cardController.name}" 
         required="false" requiredMessage="Please, enter new card Name" /> 
        <p:outputLabel value="Fill in Description:" for="cardDescription" /> 
        <p:inputTextarea id="cardDescription" rows="3" cols="33" 
         value="#{cardController.description}" /> 
        <p:outputLabel value="Upload image:" for="cardImage" /> 
        <p:fileUpload id="cardImage" 
         fileUploadListener="#{cardController.handleFileUpload}" 
         auto="false" 
         mode="advanced" dragDropSupport="false" update="messages cropped uploaded" 
         sizeLimit="100000" fileLimit="3" 
         allowTypes="/(\.|\/)(gif|jpe?g|png)$/" /> 

        <p:outputLabel value="change size of the image:" for="cropped" /> 
        <p:imageCropper id="cropped" value="#{cropperView.croppedImage}" image="#{cardController.image}" initialCoords="225,75,300,125"/> 
        <p:graphicImage id = "uploaded" value="#{cardController.image}"/> 
        <p:commandButton value="Create" 
         action="#{categoryController.create()}" 
         update=" createForm" /> 
        <p:message for="cardName" /> 


       </h:panelGrid> 
     </h:form> 

Controller:

@Controller 
@Scope("session") 
public class CardController { 

    private CroppedImage croppedImage; 
    private UploadedFile uploadedFile; 
    private String name; 
    private String description; 

    public void handleFileUpload(FileUploadEvent event) throws IOException { 
     System.out.println("!!! inside file upload"); 
     FacesMessage message = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded."); 
     FacesContext.getCurrentInstance().addMessage(null, message); 
     uploadedFile = event.getFile(); 

    } 

    public StreamedContent getImage() { 
     FacesContext context = FacesContext.getCurrentInstance(); 

     if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) { 
      // So, we're rendering the HTML. Return a stub StreamedContent so that it will generate right URL. 
      return new DefaultStreamedContent(); 
     } 
     else { 
      // So, browser is requesting the image. Return a real StreamedContent with the image bytes. 
      return new DefaultStreamedContent(new ByteArrayInputStream(uploadedFile.getContents())); 
     } 
    } 

    public void create() { 
     // shoul be logic for creating new entities 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public CroppedImage getCroppedImage() { 
     return croppedImage; 
    } 

    public void setCroppedImage(CroppedImage croppedImage) { 
     this.croppedImage = croppedImage; 
    } 

    public UploadedFile getUploadedFile() { 
     return uploadedFile; 
    } 

    public void setUploadedFile(UploadedFile uploadedFile) { 
     this.uploadedFile = uploadedFile; 
    } 

} 
+0

@BalusC: Hallo, vielen Dank für die schnelle Antwort. Wenn ich ein benutzerdefiniertes ViewScope benutze, wird das '

+0

@BalusC: Sollte '

+0

@BalusC: Vorherigen Kommentar aktualisieren: Soll

Antwort

0

Also, ich habe mein Problem auf diese Weise gelöst:

  1. Nach Bild hochgeladen wurde, ist es in temporären Speichern Verzeichnis auf der Festplatte.
  2. Aktualisierungskomponente, in der sich <p:imageCropper befindet. Das image-Attribut von <p:imageCropper sollte dem oben erstellten Pfad entsprechen (z. B. Wert = "http: // localhost: 8080/temp/# {bean.imageName}"). Beachten Sie, dass das Verzeichnis auf der Festplatte für Ihren Web-Container sichtbar sein sollte (Meine App ist auf Spring-Boot aufgebaut, daher verwendet es eingebettete Tomcat. Also habe ich zusätzlichen Apache-Server installiert und meine Bilder dort gespeichert).
  3. Beschneiden Sie das Bild und speichern Sie es auf der Festplatte. Hier

ist ein Code:

<p:fileUpload id="cardImage" 
        fileUploadListener="#{cardController.handleFileUpload}" 
        auto="true" mode="advanced" dragDropSupport="true" 
        update="messages cropped cropButton" sizeLimit="5000000" 
        allowTypes="/(\.|\/)(gif|jpe?g|png)$/" /> 
    <h:panelGrid columns="2" cellpadding="5" id="cropped"> 
        <p:outputLabel value="Crop image:" for="cropper" 
         rendered="#{not empty cardController.imageFilePath}" /> 
        <p:imageCropper id="cropper" 
         rendered="#{not empty cardController.imageFilePath}" 
         value="#{cardController.image}" 
         image="#{cardController.hostName}/#{cardController.imageFilePath}" 
         aspectRatio="1.0" initialCoords="225,75,300,125" minSize="210,210" /> 
        <p:outputLabel value="Cropped image:" for="image" 
         rendered="#{not empty cardController.croppedImageFileName}" /> 
        <p:graphicImage id="image" 
         rendered="#{not empty cardController.croppedImageFileName}" 
         value="#{cardController.hostName}/images/#{cardController.categoryId}/#{cardController.levelId}/#{cardController.croppedImageFileName}" /> 
        <p:commandButton id="cropButton" 
         rendered="#{not empty cardController.uploadedFile}" value="Crop" 
         action="#{cardController.crop()}" update="messages cropped create" 
         icon="ui-icon-scissors" /> 
        <p:commandButton value="Create" id="create" 
         rendered="#{not empty cardController.croppedImageFileName}" 
         action="#{cardController.create()}" 
         update=":cardForm:table createForm" /> 
        <p:message for="cardName" /> 
       </h:panelGrid> 

Controller:

public void handleFileUpload(FileUploadEvent event) throws IOException { 
     uploadedFile = event.getFile(); 
     File directory = new File(rootPath + TEMP_DIRECTORY); 
     directory.mkdirs(); 
     String filename = FilenameUtils.getBaseName(UUID.randomUUID().toString()); 
     String extension = FilenameUtils.getExtension(uploadedFile.getFileName()); 
     Path file = Files.createTempFile(directory.toPath(), filename + "-", "." + extension); 
     Files.copy(uploadedFile.getInputstream(), file, StandardCopyOption.REPLACE_EXISTING); 

     imageFilePath = TEMP_DIRECTORY + "/" + file.getFileName().toString(); 
     FacesMessage message = new FacesMessage("Succesful", imageFilePath + " is uploaded."); 
     FacesContext.getCurrentInstance().addMessage(null, message); 
    } 
public void crop() throws IOException { 
     if (image == null) { 
      return; 
     } 
     String imageName = URLUtils.slugify(StringUtils.transliterateRu2En(name)); 
     String croppedImagePath = IMAGES_ROOT_DIRECTORY + "/" + categoryId + "/" + levelId; 
     File directory = new File(rootPath + croppedImagePath); 
     directory.mkdirs(); 

     String filename = FilenameUtils.getBaseName(imageName); 
     String extension = FilenameUtils.getExtension(image.getOriginalFilename()); 
     Path file = Files.createTempFile(directory.toPath(), filename + "-", "." + extension); 
     InputStream is = new ByteArrayInputStream(image.getBytes()); 
     Files.copy(is, file, StandardCopyOption.REPLACE_EXISTING); 

     croppedImageFileName = file.getFileName().toString(); 
     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Success", "Cropping finished.")); 
    }