我是Grails的新手,但我认为我做得还不错,直到我开始搞乱文件上传。我正在尝试将文件上传到S3并将文件位置存储在我的数据对象中。
我的问题是可以正常上传文件,也可以更新数据对象,但是出于某种疯狂的原因,我不能同时做这两项!
这是简化的测试代码:
GSP表格:
<form method="post" url="[resource:fileBundleInstance, action:'test']" enctype="multipart/form-data">
<input type="file" name="bundle">
<g:actionSubmit class="save" action="test" value="Test" />
</form>
Controller :
@Transactional
def test(FileBundle fileBundleInstance) {
def file = request.getFile('bundle')
println file ? "found " + file.originalFilename : "no file"
fileBundleInstance.state = "test" // only works if no file input in form
redirect (action:'edit', id: fileBundleInstance.id)
}
因此,此代码可以很好地获取文件,但不会更新FileBundleInstance的状态。但是,如果我注释掉文件上传表单元素:
<form method="post" url="[resource:fileBundleInstance, action:'test']" enctype="multipart/form-data">
<!--input type="file" name="bundle"-->
<g:actionSubmit class="save" action="test" value="Test" />
</form>
...状态突然变好了(但是我当然没有文件)!
我怀疑我从根本上误解了GSP表格如何在grails中工作-有人可以让我正确吗?
最佳答案
糟糕,这是我的错误:-/。
事实证明,我在文件中使用的名称“bundle”也是数据对象中字段的名称。 Grails抛出数据异常,并且我没有很好的错误处理能力(新手,请记住:-))。
当我添加行时:
fileBundleInstance.save();
fileBundleInstance.errors.allErrors.each {error ->
println error.toString()}
我看到了很好的 Shiny 错误-如果将名称从“bundle”更改为“myfile”,则一切正常。哎呀。
关于forms - 当文件包含在GSP表单中时,Grails不会更新数据对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32513431/