猿问

HTTP POST Angular 到 Java。不能发送多个不同类型的参数

我正在尝试将上传的文件(来自 Angular 的 FormData)和同一个 HTTP POST 请求中的字符串发送到后端(Java 使用 Grizzly 服务器和 Ajax 用于 REST 服务)。问题是我收到 HTTP 400 Bad Request 因为文件没有正确映射:


jersey message: Can not construct instance of java.io.InputStream: abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type

在前端,我有一个名为 Form 的类,它是使用 ng g class Form 创建的,其中包含:


export class Form {

    private file:FormData;

    private bookName: String;


    constructor(file:FormData, bookName: String) {

        this.file = file;

        this.bookName = bookName;

    }

}

Frontend 的 HTTP POST 方法是:


  sendFormData() {

    const form  = new Form(this.testData, this.bookName);


    this.pdfService.sendFormData(form).subscribe((res) => {

      console.log(res);

    });

  }

上面的 this.testData 具有 FormData 类型,而 this.bookName 是一个字符串。它们都包含预期的输入值。


pdfService.sendFormData 是:


  public sendFormData(form: Form) {

    console.log("sending to " + this.baseUrl + "uploadFile")

    return this.http.post(this.baseUrl + "uploadFile", form, { responseType: 'text' });

  }

在后端我有一个类 Form.java (映射类):


public class Form {

    String bookName;

    InputStream file;

    ... (getters & setters & constructor)

}

HTTP POST 方法是:


    @POST

    @Consumes(MediaType.APPLICATION_JSON)

    @Produces(MediaType.TEXT_HTML)

    @Path("uploadFile")

    public Response convertPdfToHtml(Form form) {

            ...

    }

要获取映射的字符串,我使用:form.getBookName() 并获取映射的文件,我使用:form.getFile()。


正如我所说,问题是来自前端的文件没有正确映射到来自后端的 InputStream。


我应该使用什么类型将前端的 FormData 映射到后端的类型?或者我可以使用哪些其他实现在同一个 POST 请求中发送文件和字符串?


慕雪6442864
浏览 120回答 1
1回答

达令说

在 POST 方法中,您应该提供 FormData 类型的对象,并且有export class Form {  private file: File;  private bookName: String;  constructor(file:File, bookName: String) {    this.file = file;    this.bookName = bookName;  }}public sendFormData(form: Form) {  const formData = new FormData();  formData.append('bookName', form.bookName);  formData.append('file', form.file, form.file.name);  console.log("sending to " + this.baseUrl + "uploadFile")  return this.http.post(this.baseUrl + "uploadFile", formData, {responseType: 'text'});}你会得到内容类型为 multipart/form-data 的帖子
随时随地看视频慕课网APP

相关分类

Java
我要回答