【问题标题】:multipart form data not invoking the web service API不调用 Web 服务 API 的多部分表单数据
【发布时间】:2014-03-31 19:17:54
【问题描述】:

我正在尝试从 iOS 客户端发送多部分表单数据。数据是多部分数据,我对此很确定。

服务器基于 JAX-RS (Jersery)。如果我使用下面的代码

@POST
@Path("/customerdetail")
@Consumes({"multipart/form-data"})
public String postCustomerDetails(InputStream message){ 

StringBuilder inputStringBuilder = new StringBuilder();
BufferedReader bufferedReader; try { bufferedReader = new BufferedReader(new         InputStreamReader(message, "UTF-8")); 
String line = bufferedReader.readLine(); 
while(line != null){ inputStringBuilder.append(line);
inputStringBuilder.append('\n'); 
line = bufferedReader.readLine(); }
System.out.println(inputStringBuilder.toString()); 

}

我将多部分表单数据作为输入流。但是除了实现令人厌烦的字符串操作之外,我应该如何进一步从输入字符串中提取数据。

如果我使用下面的代码

@POST
@Path("/customerdetail")
@Consumes({"multipart/form-data"})
public String postCustomerDetails(FormDataMultiPart  formParams) {

}  

postCustomerDetails 方法根本没有被调用。

关于如何解析多部分数据的任何输入都会很有帮助。我是否使用了正确的方法。泽西岛专家请。帮我。提前致谢。

【问题讨论】:

    标签: java rest jersey jax-rs multipartform-data


    【解决方案1】:

    在您的第一种方法中,您没有从多部分请求中注释您想要的“部分”,因此您的 InputStream message 返回所有原始多部分请求正文。

    您需要做的是指定哪个表单名称包含您的文件上传。

    例如,如果您的客户端有<input type="file" name="myfile">

    public String postCustomerDetails(@FormDataParam("myfile") InputStream message){...}
    

    这样message就只包含你上传文件的内容,所以你不用解析整个请求体来挖掘它。

    也许你没有在你的客户端应用中使用 html 表单,而是手动构建了一些多部分请求,你仍然需要知道表单中的名称是什么。

    在您当前的方法中,只需打印出整个请求正文,它会是这样的:

    Content-Type: multipart/form-data; boundary=Boundary_1_511262261_1369143433608
    
    --Boundary_1_511262261_1369143433608
    Content-Type: text/plain
    Content-Disposition: form-data; name="hello"
    
    hello
    --Boundary_1_511262261_1369143433608
    Content-Type: application/xml
    Content-Disposition: form-data; name="xml"
    
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?><jaxbBean><value>xml</value></jaxbBean>
    --Boundary_1_511262261_1369143433608
    Content-Type: application/json
    Content-Disposition: form-data; name="json"
    
    {"value":"json"}
    --Boundary_1_511262261_1369143433608--
    

    name="hello" 是您所追求的。然后你可以得到这样的 3 个部分:

    public String postCustomerDetails(
      @FormDataParam("hello") InputStream helloInput,  // the file input for "hello"
      @FormDataParam("hello") FormDataContentDisposition helloDetail, // optional, for getting file name and size, etc
      @FormDataParam("xml") InputStream xmlInput,
      @FormDataParam("xml") FormDataContentDisposition xmlDetail,
      @FormDataParam("json") InputStream jsonInput,
      @FormDataParam("json") FormDataContentDisposition jsonDetail
    ){...}
    

    对于您使用FormDataMultiPart 的第二种方法,我从不使用那个低级别的api,但我刚刚测试过并且它可以工作。我不知道为什么它没有为你触发。

    祝你好运。

    【讨论】:

    • 非常感谢。我的输入流中没有文件。所有数据均为字符串格式。鉴于这种情况,以下方法是否正确 public String postCustomerDetails(@FormDataParam("name1") InputStream helloInput,@FormDataParam("name2") InputStream helloInput,@FormDataParam("name3") InputStream helloInput){..}。非常感谢您的回复。
    • 感谢您的回答。
    • 是的,但你不能在 helloInput 之后命名所有这些 :),改变你的变量名。
    • @huocp- 谢谢。我试过这个。还是行不通。不知道我哪里出错了。
    • 有什么例外吗? @FormDataParam("name1") InputStream helloInput 的读数是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 2021-03-14
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多