通过单个请求发送 JSON 和图像。 Angular + Spring Boot

2024-01-09

弹簧支撑控制器

@PostMapping(
    value = "/post",
    produces = MediaType.APPLICATION_JSON_VALUE,
    consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE}
)
public ResponseEntity<User> handleFileUpload(@RequestParam("user") User user, @RequestPart("file") MultipartFile file) {
    // do something with User and file
    return ResponseEntity.ok().build();
}

角度服务

@Injectable()
export class UploadFileService {

  constructor(private http: HttpClient) { }
  pushFileToStorage(file: File): Observable<HttpEvent<{}>> {
    let formdata: FormData = new FormData();
    formdata.append('file', file);
    formdata.append('user', JSON.stringify(new User('John', 12)))

    const req = new HttpRequest('POST', '/post', formdata, {
      reportProgress: true,
    });

    return this.http.request(req);
  }
}

当我尝试发送请求时,我得到了500 Internal Server Error.

这是一个请求标头

POST /post HTTP/1.1
Host: localhost:4200
Connection: keep-alive
Content-Length: 152881
Accept: application/json, text/plain, */*
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarydaQb5yaWw2xu1V9r
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

请求负载

------WebKitFormBoundarydaQb5yaWw2xu1V9r
Content-Disposition: form-data; name="file"; filename="Screen Shot 2017-10-24 at 8.49.13 PM.png"
Content-Type: image/png


------WebKitFormBoundarydaQb5yaWw2xu1V9r
Content-Disposition: form-data; name="user"

{"name":"John","age":12}
------WebKitFormBoundarydaQb5yaWw2xu1V9r--

注意:如果在 Spring Rest 控制器中我将参数类型 User 更改为 String 它可以工作。

问题:如何从 Angular 发送请求,以便在 Spring 上我可以获得 User 和 MultipartFile,而不是 String。


Changing

public ResponseEntity<User> handleFileUpload(@RequestParam("user") User user, @RequestPart("file") MultipartFile file)

to

public ResponseEntity<User> handleFileUpload(@RequestPart("user") User user, @RequestPart("file") MultipartFile file)

并将请求更改为类似这样的内容将会起作用:

curl -i -X POST -H "Content-Type: multipart/form-data" \
-F 'user={"name":"John","age":12};type=application/json' \
-F "[email protected] /cdn-cgi/l/email-protection" http://localhost:8080/post

For consumes only MediaType.MULTIPART_FORM_DATA_VALUE是必须的。

要以角度提出上述类型的请求,可以这样做:

const userBlob = new Blob(JSON.stringify(new User('John', 12)),{ type: "application/json"});
formdata.append('user', userBlob);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过单个请求发送 JSON 和图像。 Angular + Spring Boot 的相关文章

  • Spring 排序的 beans 列表

    我有几个实现相同接口的 bean 每个 bean 都注释有 Component Order SORT ORDER public class MyClass implements BeanInterface 有一次 我自动装配了一个组件列表
  • 假装下载文件

    我试图找到一种简单的方法来使用 Feign 下载 csv 文件 保留文件名 最简单 最干净的方法是什么 feign form github 页面上的多部分解决方案非常冗长 并且不适合我 任何帮助表示赞赏 假冒客户 import feign
  • 有什么方法可以在 ViewChildren 中获取 ElementRef 和 Component ref 吗?

    我想从视图中获取本机元素及其相关组件的列表 我会尝试做类似的事情 但它不起作用 ViewChildren element read ElementRef MyComponent private elements QueryList
  • 错误:找不到模块:错误:无法解析“@angular/cdk/scrolling”

    我遇到了错误 找不到模块 错误 无法解析 angular cdk scrolling 一旦我在 app module ts 中添加 import TableModule from primeNG 为什么会抛出这个错误 我没有看到 prime
  • 如何获取 Angular2 中元素的当前位置信息

    我有ElementRef我的导航栏 我试图找出它离我的窗口顶部有多近 这样我就可以让它粘起来 div class nav bar div ViewChild navBar navBarElement 我正在滚动事件中打印出它的 native
  • 如何在项目中全局声明类型(typescript)

    在打字稿项目中 有没有办法声明一个类型并在所有文件之间共享它 就像我们可以访问全局定义的类型一样node d ts 例如 假设在我的项目中IUser是诸如 interface IUser name string mail string 好的
  • 如何使用spring AOP拦截所有带有@Repository注解的存储库类

    我试图拦截我的所有返回列表BaseRepostitary文件 这样我就可以找到列表中必须使用此解密的名称decrypt方法 以下是我的方面类 Aspect Service public class DecryptionAspect Afte
  • 源有 X 个元素,但目标仅允许 1 个

    打字稿编译显示此错误 源有 X 个元素 但目标仅允许 1 个 export const FooMapping id FooOperation display string id FooOperation Undefined display
  • 错误:“导航器”类型上不存在属性“通知”

    我正在尝试使用 ionic 插件cordova plugin dialogs 插件正在运行 我可以调用navigator notification alert 并创建一个本机警报提示 但每当我的应用程序构建时 我都会收到以下控制台错误 错误
  • Angular2:视图未从订阅内部更新

    我有一个简单的 angular2 rc1 组件 它订阅了一项服务 当服务更新订阅时 我可以将结果记录在组件的订阅中 但视图不会更新 我最初的怀疑是我的内心this没有绑定到外部 但我在外面使用了一个粗箭头subscribe回调 也尝试了旧的
  • useReducer hook,如何对动作进行类型检查?

    我一直在 stackoverflow 上查看各种资源 但还没有找到任何可以解决我遇到的问题的内容 我对 typescript 有基本的了解 所以错误限制了我 如果我离开action any在我的减速器中 错误消失了 但是 如果我输入Acti
  • 为什么将空字符串设置为空反应形式成为空字符串

    我试图在更改时将每个字符串输入转换为 null 因此 我创建一个指令来监听每个更改并将 null 分配给空字符串 这是 HTML
  • MockMVC 给出 HttpMessageNotReadableException

    我仍在学习测试方法 并且正在尝试让 MockMvc 测试为我工作 这是一个简单的 REST 控制器 此时仅使用帖子中的 json 信息进行一些身份验证 我实际上已经实现了代码 所以我知道它正在工作 因为我收到了带有正确输入的正确响应和我放在
  • Angular 2 TypeError:无法读取 null 的属性“animate”

    我正在使用 Chrome 51 和 Angular 2 rc4 并在加载我的 Angular 应用程序时在控制台中弹出以下错误 TypeError Cannot read property animate of null at e supp
  • 导入java spring项目后如何构建maven

    你好 我是 java spring 概念的新手 所以我下载了一个示例spring应用程序并将其导入到eclipse中 我已经阅读了spring教程 要么我必须将maven安装到eclipse中才能运行spring项目 所以我已经安装了mav
  • Eclipse + Spring Boot 中“抛出 new SilentExitException()”处的断点

    每次我在 Eclipse IDE Spring Tool Suite 中以调试模式运行 Spring Boot 项目时 线程都会停止在throw new SilentExitException 即使没有断点也行 有什么解决方案可以避免这种行
  • Spring批处理2.2 JavaConfig

    我正在尝试让 Spring Batch 2 2 与 JavaConfig 一起使用 如今他们有一个 EnableBatchProcessing设置很多东西的注释 默认情况下 该注释使用数据源作为其作业数据 但我们不想保存此数据 也不想为其创
  • 在运行时后期更改 SessionFactory 数据源 jdbcurl

    我正在为没有网络连接的环境编写一个桌面java应用程序 我试图将应用程序数据尽可能安全地存储在加密的进程内 hsqldb 中 并使用未加密的用户信息 hsqldb Hsqldb 要求在创建连接时在 jdbcurl 中设置 crypto ke
  • 使用 Hibernate/Spring 生成数据库更新脚本

    我有一个项目 我们过去依赖 hibernate 来更新数据库 hibernate hbm2ddl auto update 即使在产品上 我正在将其迁移为使用 liquibase 我唯一担心的是 并不是我的团队中的每个人都是 sql 专家 因
  • Angular 4 - 具有动态参数值的自定义验证器

    我编写了一个自定义验证器 用于检查日期是否高于某个最小日期 代码如下所示 export function validateMinDate min Date ValidatorFn return c AbstractControl gt if

随机推荐