当前位置: 首页 > 知识库问答 >
问题:

在rest控制器中的单个endpoint上合并文件上传和请求正文

司知
2023-03-14

我的webapp的UI可以上传文件(csv),也可以在请求正文中以json格式发送数据。但是,请求中可能存在文件上载或json请求,而不是两者都存在。我正在创建一个spring-rest控制器,它结合了文件上传,也接受了请求json值。

从邮递员测试以下endpoint后,我没有遇到异常:

org.apache.tomcat.util.http.fileupload。FileUploadException:请求被拒绝,因为找不到多部分边界

@RestController
public class MovieController {

private static final Logger LOGGER = LoggerFactory.getLogger(MovieController.class);

@PostMapping(value="/movies", consumes = {"multipart/form-data", "application/json"})
public void postMovies( @RequestPart String movieJson, @RequestPart(value = "moviesFile") MultipartFile movieFile ) {

    // One of the below value should be present and other be null
    LOGGER.info("Movies Json Body {}", movieJson);
    LOGGER.info("Movies File Upload {}", movieFile);
}

}

感谢您对解决此问题的任何帮助?

注意:我能够为文件上传和json请求构建两个独立endpoint,但是这不能满足我的要求。因此,我正在寻找一种结合两者的解决方案

共有2个答案

井唯
2023-03-14

尝试类似这样的内容:

@RequestMapping(value = "/movies", method = RequestMethod.POST, consumes = { "multipart/form-data", "application/json" })
public void postMovies(
        @RequestParam(value = "moviesFile", required = false) MultipartFile file, 
  UploadRequestBody request) {

在RequestBody中,您可以添加要发送的参数
这不会以JSON格式发送数据
编辑:-我忘记为Multipart文件添加变量,我错误地使用了RequestBody,它是spring中的保留关键字。希望能有所帮助。

慎俊艾
2023-03-14

我建议创建两个单独的endpoint。这将分割和隔离不同的功能,并降低代码的复杂性。此外,测试将更容易,并提供更好的可读性。

您的客户端实际上必须知道使用哪个变量。因此,只需为您的请求选择不同的endpoint,而不是为同一endpoint使用不同的变量。

@PostMapping(value="/movies-file-upload", consumes = {"multipart/form-data"})
public void postMoviesFile(@RequestPart(value = "moviesFile") MultipartFile movieFile ) {

    LOGGER.info("Movies File Upload {}", movieFile);
}

@PostMapping(value="/movies-upload", consumes = {"application/json"})
public void postMoviesJson( @RequestPart String movieJson) {

    LOGGER.info("Movies Json Body {}", movieJson);
}
 类似资料:
  • 是否可以使用数据上传包含其他数据(如描述等)的文件?我正在使用骨干.js在我的前端,我用它调用REST API(jQuery)。我不使用任何视图解析器,但我想以某种方式将我的文件传递给控制器,如下所示: 以便uploadItem存储: 但是我不会(也不能)把这个加到我的模型里。 当然,我也很感兴趣是否有可能有这样的控制器:

  • 问题内容: 我正在执行一个使用Python请求库上传文件的简单任务。我搜索了Stack Overflow,似乎没有人遇到相同的问题,即服务器未收到该文件: 我用文件名填充了’upload_file’关键字的值,因为如果我将其保留为空白,则表示 现在我明白了 仅当文件为空时才会出现。因此,我对如何成功发送文件感到困惑。我知道该文件有效,因为如果我访问此网站并手动填写表格,它将返回一个很好的匹配对象列

  • 我想上传多个文件到服务器。这是我的角度代码: 控制器的一部分: 问题是在控制器中: “files”列表总是空的(我也尝试了MultipartFile[]而不是list)。只有在指令中返回的不是所有文件,而是一个文件时,它才有效,例如: 代替

  • 问题内容: 我在Node.js中使用POST请求上传文件时遇到问题。我必须使用模块来完成该操作(无需外部npms)。服务器需要它是包含文件数据字段的多部分请求。看起来很容易,但不使用任何外部模块就很难在Node.js中完成。 我尝试使用此示例,但未成功: 问题答案: 看起来您已经在使用module了。 在这种情况下,您需要发布的只是使用其功能: 但是,如果您想从文件系统中发布一些现有文件,则可以简

  • 我正在尝试通过REST API在服务器上上传文件。我的api请求FormData模型,但Im得到错误。 devtools中得“我得请求”得有效负载 ------WebKitFormBoundaryVpirgXMC3RU3AOFA内容-配置:表单-数据;name=“文件”;filename=“test.jpg”content-type:image/jpeg -----WebKitFormBounda

  • 我有一个ASP。NET文件上载控件,当您单击上载按钮选择要上载的文件时,该控件将打开一个窗口。但问题是,网络驱动程序无法识别窗口,因此无法选择要上载的文件。 我在stackoverflow中找到了许多使用sendkey输入文件路径的解决方案。我认为当你有html文件上传控制时,这是有效的。在我的情况下,我有ASP。NET文件上传控件,它没有文本框,我可以在其中使用sendkey输入文件路径。 我该