我知道这可能不常见,但也许有人会知道答案。 我需要向Grails动作发出请求,其中包含正常信息(json数据)和文件作为multipart。我必须将所有数据作为formData发送,这得到了ng-file-upload angular指令的良好支持。所以我这样做:
Upload.upload({
url: config.REST + params.method,
file: params.file,
data: params.data,
headers: {
'X-Auth-Token': token
}
});
请求没问题,200 OK但是后端grails端有错误。在params.data中有类似的JSON:
{
pet: {
name: "Azor",
//...
},
attrs: [
{
//....
}
]
}
文件来自该插件,这是唯一与Grails中的命令对象正确绑定的东西。在那个动作中我有命令对象:
class PetCommand {
Pet pet
List<PetsAttribute> petsAttributes
MultipartFile file
}
行动:
def authCreate(PetCommand petCommand) {
try {
//...
}
catch(e) {
log.error 'Error: ' + e.message, e
render([status: "error", message: e.message] as JSON)
}
}
问题是该请求中的数据未正确绑定到命令对象。 petCommand.pet和petCommand.petsAttributes为null,只有petCommand.file可以。如果我将其作为JSON发送但是文件无法以这种方式上传,则效果很好。
我打印了params,在params中我们有所有数据。它被格式化为formData,因此可能因为命令对象无法绑定它。
答案 0 :(得分:0)
尝试手动将文件附加到命令对象。
def somePostSaveAction() {
MultipartHttpServletRequest request = (MultipartHttpServletRequest) request
MultipartFile file = request.getFile('file')
UploadCommand cmd = new UploadCommand()
bindData(cmd, params)
cmd.file = file
cmd.filename = file.name
cmd.filesize = file.size
cmd.filetype = file.contentType
}