【问题标题】:How to post model data and files?如何发布模型数据和文件?
【发布时间】:2018-06-10 05:03:34
【问题描述】:

我有一个这样的控制器:

@RequestMapping(value = "/user/", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody 
public UserLesserDTO createUser(@RequestParam("profileImageFile") MultipartFile file, @RequestBody UserDTO user, @PathVariable("method") String method) {
    // Save profileImage as a profile image and store the image file name in user's profileImage attribute.
    // save user.
}

我有一个 HTML 表单,其中所有用户的属性为 <input type="text" name="user attribute name"> 加上一个 <input type="file" name="profileImageFile">

我收到错误 415,例如:The origin server is refusing to service the request because the payload is in a format not supported by this method on the target resource.

但是当我从 createUser() 方法的签名中删除 @RequestBody UserDTO user 时,上传文件部分开始工作,我可以获取文件。

已阅读 thisthis 以设置数据绑定器。

@InitBinder
public void initBinder(WebDataBinder binder, WebRequest request) {
    binder.setDisallowedFields("user.profileImage");
    binder.setAllowedFields("profileImageFile");
}

但这并没有改变。

【问题讨论】:

  • 你在使用 Spring Data 吗?
  • 我不知道。正是我在这里展示的。需要查看我的 POM? github.com/icemagno/geoinfra/blob/master/cerberus/hades/pom.xml
  • 恕我直言 Spring 混淆了如何处理属性。 Struts 使用 html 中的模型映射模型属性,例如 user.name
  • @PaulWarren 没有。我正在实现自己的存储库,但我的问题是关于表示层的,与持久性无关。即使我没有持久性,问题是:我无法将文件和模型数据从 Web 界面 (html) 发布到控制器。与持久层无关。
  • 我的上帝。我在网上看到的每个教程都只是发布文件或模型数据。没有人,我说没有人同时发布。现在我知道为什么 Facebook 只允许你更新你的照片或个人资料数据,但不能同时更新。耶稣!

标签: spring-mvc


【解决方案1】:

我需要道歉。

首先我不显示我的 HTML 表单。其次,因为我不知道它实际上是一个 JSP 页面。因为我需要做一些功课。

我必须使用form:form(Spring 表单)和modelAttribute="<THE_MODEL>" 创建我的表单,并使用path="<ATTRIBUTE>" 在控制器级别将HTML 表单字段映射到我的模型。

<form:form enctype="multipart/form-data" modelAttribute="userToEdit" />
    <form:input name="username" path="username" /> 
</form:form>

控制器:

@RequestMapping(value = "/user/{method}", method = RequestMethod.POST)
    public String home(@RequestParam("profileImageFile") MultipartFile file, @PathVariable("method") String method, @ModelAttribute("userEdt") User user) {
    // Save image file
    // Save user ...
}

我不确定modelAttribute 部分。我认为这只是将来自控制器的模型映射到页面,与将表单发送到接收器控制器无关。无论如何......它现在正在工作。我可以在一个发布操作中获取文件和模型(实体)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2015-08-05
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多