文件上传不适用于 Grails 中的默认脚手架
File uploads not working with default scaffolding in Grails
在 Grails 3.1.19 中,我创建了一个域 class,其中包含以下字段
byte[] caCert.
访问生成的创建操作时,我会看到一个文件浏览对话框并上传一个文件。单击创建时我得到
caCert is type-mismatched
.
查看 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>
看起来你按照 the documention 做了所有事情。
也许您可以尝试更改您的模板以包含上传表单标签?
<g:uploadForm action="upload">
<input type="file" name="myFile" />
<input type="submit" />
</g:uploadForm>
我希望这能增加一些价值。
在这里遇到同样的问题。
创建了一个基本域 class,其属性类型为 byte[] 和 运行 默认脚手架。
尝试保存实例时获取 "type-mismatched" 验证消息。
根据 Gorille 的回答,我检查了文档并将属性 enctype="multipart/form-data" 添加到 g:form 标签会使它起作用。
不太确定为什么脚手架无法处理。
<g:form action="save" enctype="multipart/form-data">
正如他提到的,其他选择是将标签更改为 g:uploadForm,看起来是专门为此而设计的。
The uploadForm tag conveniently adds the enctype="multipart/form-data" attribute to the standard tag.
uploadForm: Identical to the standard form tag except that it sets the enctype attribute to "multipart/form-data" automatically.
我检查了参数,它有完整的文件。
在 Grails 3.1.19 中,我创建了一个域 class,其中包含以下字段
byte[] caCert.
访问生成的创建操作时,我会看到一个文件浏览对话框并上传一个文件。单击创建时我得到
caCert is type-mismatched
.
查看 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>
看起来你按照 the documention 做了所有事情。
也许您可以尝试更改您的模板以包含上传表单标签?
<g:uploadForm action="upload">
<input type="file" name="myFile" />
<input type="submit" />
</g:uploadForm>
我希望这能增加一些价值。
在这里遇到同样的问题。 创建了一个基本域 class,其属性类型为 byte[] 和 运行 默认脚手架。
尝试保存实例时获取 "type-mismatched" 验证消息。
根据 Gorille 的回答,我检查了文档并将属性 enctype="multipart/form-data" 添加到 g:form 标签会使它起作用。 不太确定为什么脚手架无法处理。
<g:form action="save" enctype="multipart/form-data">
正如他提到的,其他选择是将标签更改为 g:uploadForm,看起来是专门为此而设计的。
The uploadForm tag conveniently adds the enctype="multipart/form-data" attribute to the standard tag.
uploadForm: Identical to the standard form tag except that it sets the enctype attribute to "multipart/form-data" automatically.
我检查了参数,它有完整的文件。