2016-07-23 23 views
0

In Grails 3.1.19 Ich habe eine Domain-Klasse mit dem folgende Feld erstelltDas Hochladen von Dateien funktioniert nicht mit Standard Baugerüst in Grails

byte[] caCert. 

Wenn die Aktion erstellen erzeugt Zugriff erhalte ich einen Dateidialog durchsuchen und eine Datei hochladen . Wenn ich auf create klicke, bekomme ich caCert is type-mismatched.

Mit Blick auf die Params-Objekt wird angezeigt, dass ich nur den Namen der Datei, die eine Zeichenfolge ist. Wie kann ich mit dem Standard-Scaffolding die Felder byte [] erhalten, um den Inhalt der hochgeladenen Datei tatsächlich zu erhalten? Der Controller erstellen Code ist

def create() { 
    respond new TaskUser(params) 
} 

Und die Sparsteuerung Aktion ist

def save(TaskUser taskUser) { 
    if (taskUser == null) { 
     transactionStatus.setRollbackOnly() 
     notFound() 
     return 
    } 

    if (taskUser.hasErrors()) { 
     transactionStatus.setRollbackOnly() 
     respond taskUser.errors, view:'create' 
     return 
    } 

    taskUser.save flush:true 

    request.withFormat { 
     form multipartForm { 
      flash.message = message(code: 'default.created.message', args: [message(code: 'taskUser.label', default: 'TaskUser'), taskUser.id]) 
      redirect taskUser 
     } 
     '*' { respond taskUser, [status: CREATED] } 
    } 
} 

Der bilden einen Teil der Vorlage erstellen ist unter

<div id="create-taskUser" class="content scaffold-create" role="main"> 
    <h1><g:message code="default.create.label" args="[entityName]" /></h1> 
    <g:if test="${flash.message}"> 
    <div class="message" role="status">${flash.message}</div> 
    </g:if> 
    <g:hasErrors bean="${this.taskUser}"> 
    <ul class="errors" role="alert"> 
     <g:eachError bean="${this.taskUser}" var="error"> 
     <li <g:if test="${error in org.springframework.validation.FieldError}">data-field-id="${error.field}"</g:if>><g:message error="${error}"/></li> 
     </g:eachError> 
    </ul> 
    </g:hasErrors> 
    <g:form action="save"> 
     <fieldset class="form"> 
      <f:all bean="taskUser"/> 
     </fieldset> 
     <fieldset class="buttons"> 
      <g:submitButton name="create" class="save" value="${message(code: 'default.button.create.label', default: 'Create')}" /> 
     </fieldset> 
    </g:form> 
</div> 
+0

Obwohl Sie keinen Code angezeigt haben, sieht es so aus, als würden Sie etwas falsch machen. params. "fileuploadparam" sollte Byte [] zurückgeben.Können Sie bitte die gerüstete Controller-Aktion und jede Domäne, die Sie binden, teilen. –

Antwort

3

Ich hoffe, das fügt einen gewissen Wert hinzu.

Kämpfen mit dem gleichen Problem hier. Eine Basisdomänenklasse mit einem Attribut vom Typ Byte [] erstellt und das Standardgerüst ausgeführt.

Erhalte die Validierungsnachricht "type-mismatched" beim Versuch, die Instanz zu speichern.

Basierend auf Gorille Antwort überprüfte ich die Dokumentation und das Hinzufügen des Attributs enctype = "multipart/form-data" zum g: Form Tag würde es funktioniert machen. Nicht wirklich sicher, warum das Gerüst das nicht handhabt.

<g:form action="save" enctype="multipart/form-data"> 

Andere Option, wie er erwähnte, ist den Tag g zu ändern: uploadForm, die für das heißt speziell aussieht.

Doc:

Der uploadForm Tag fügt bequem die enctype = "multipart/form-data" -Attribut auf den Standard-Tag.

Tag doc:

uploadForm: Identisch mit dem Standard-Form-Tag, außer dass es die enctype setzt Attribut auf "multipart/form-data" automatisch.

Ich habe Params überprüft und es hat die komplette Datei.

1

Es sieht aus wie Sie everyhing tat, wie pro the documention .

Vielleicht könnten Sie versuchen, Ihre Vorlage so zu ändern, dass sie ein uploadForm-Tag enthält?

<g:uploadForm action="upload"> 
     <input type="file" name="myFile" /> 
     <input type="submit" /> 
</g:uploadForm>