Angular + Grails:在多部分请求上绑定的问题

时间:2015-10-23 22:41:57

标签: angularjs file grails request multipart

我知道这可能不常见,但也许有人会知道答案。 我需要向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,因此可能因为命令对象无法绑定它。

1 个答案:

答案 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
}