文件上载不使用Grails中的默认脚手架

文件上载不使用Grails中的默认脚手架,grails,grails-3.0,Grails,Grails 3.0,在Grails3.1.19中,我创建了一个具有以下字段的域类 byte[] caCert. 当访问生成的创建操作时,我会看到一个文件浏览对话框并上传一个文件。单击“创建”时,我将获得 caCert的类型不匹配 查看params对象,我似乎只得到文件名,它是一个字符串。使用默认的脚手架,我如何获取byte[]字段以实际获取我上传的文件的内容?创建控制器代码为 def create() { respond new TaskUser(params) } 保存控制器操作是 def save(

在Grails3.1.19中,我创建了一个具有以下字段的域类

byte[] caCert.
当访问生成的创建操作时,我会看到一个文件浏览对话框并上传一个文件。单击“创建”时,我将获得
caCert的类型不匹配

查看params对象,我似乎只得到文件名,它是一个字符串。使用默认的脚手架,我如何获取byte[]字段以实际获取我上传的文件的内容?创建控制器代码为

def create() {
    respond new TaskUser(params)
}
保存控制器操作是

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] }
    }
}
创建模板的表单部分如下所示

<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>

${flash.message}

看起来你做的每件事都是按照你的要求做的

也许您可以尝试更改模板以包含uploadForm标记

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

看起来你做的每件事都是按照你的要求做的

也许您可以尝试更改模板以包含uploadForm标记

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

我希望这能增加一些价值

我一直在努力解决同样的问题。 创建了一个具有byte[]类型属性的基本域类,并运行默认的脚手架

尝试保存实例时获取“类型不匹配”验证消息

根据Gorille的回答,我检查了文档,并将属性enctype=“multipart/form data”添加到g:form标记中,这样就可以工作了。 我不太清楚为什么脚手架不能处理这个问题

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

正如他所提到的,另一个选择是将标记更改为g:uploadForm,这看起来是专门针对这个的

uploadForm标记方便地将enctype=“multipart/form data”属性添加到标准标记中

:

uploadForm:与标准表单标记相同,只是它自动将enctype属性设置为“multipart/form data”


我已经检查了参数,它有完整的文件。

我希望这会增加一些价值

我一直在努力解决同样的问题。 创建了一个具有byte[]类型属性的基本域类,并运行默认的脚手架

尝试保存实例时获取“类型不匹配”验证消息

根据Gorille的回答,我检查了文档,并将属性enctype=“multipart/form data”添加到g:form标记中,这样就可以工作了。 我不太清楚为什么脚手架不能处理这个问题

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

正如他所提到的,另一个选择是将标记更改为g:uploadForm,这看起来是专门针对这个的

uploadForm标记方便地将enctype=“multipart/form data”属性添加到标准标记中

:

uploadForm:与标准表单标记相同,只是它自动将enctype属性设置为“multipart/form data”


我已经检查了params,它有完整的文件。

虽然您没有显示任何代码,但看起来您做错了什么。params.“fileuploadparam”应返回字节[]。你能分享脚手架控制器动作和你绑定的任何域吗?虽然你没有显示任何代码,但看起来你做错了什么。params.“fileuploadparam”应返回字节[]。你能分享脚手架控制器动作和你绑定的任何域吗。