我正在尝试从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方法。
有关如何解析多部分数据的任何输入都将非常有用。我使用正确的方法吗?泽西岛专家请。帮我。提前谢谢。
答案 0 :(得分: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,但我只是测试了它的确有效。我不知道为什么不会为你触发它。