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

在多部分/表单数据请求中上传文件时,泽西抛出ParseExcture

邓季
2023-03-14

我正试图发送一个mp3文件和一些元数据到我的Jersey REST服务。为此,我尝试使用multipart/form数据内容类型,但我总是使用java。文本ParseException:发送请求时,下一个事件不是分隔符。整个答复如下:

{"restResponse":{
"responseCode":"INVALID_PARAMETER",
"i18nMessage":"Invalid Parameter: Next event is not a Separator",
"responseDescription":"The request contains an invalid parameter"}}

如果我从请求中删除mp3文件,它将正常工作,所以我假设我的请求是如何构建的存在问题。我使用爪子,它生成这样的请求:

POST /rest/myapi/recording/multipart HTTP/1.1
Accept: application/json
Accept-Language: en-US
Content-Type: multipart/form-data; boundary=EI6FArOacJKf5JCY5BAA2sbl2IAfN8ty
Cookie: JSESSIONID=a5f5cfa7329142158766a6182645; JSESSIONIDSSO=BAFA3371F6D14A179B0BA6216DD6C119
Host: localhost:8181
Connection: close
User-Agent: Paw/2.2.2 (Macintosh; OS X/10.10.5) GCDHTTPRequest
Content-Length: 44504

--EI6FArOacJKf5JCY5BAA2sbl2IAfN8ty
Content-Disposition: form-data; name="queue"

qMultipart
--EI6FArOacJKf5JCY5BAA2sbl2IAfN8ty
Content-Disposition: form-data; name="datetime"

20151029-021807
--EI6FArOacJKf5JCY5BAA2sbl2IAfN8ty
Content-Disposition: form-data; name="recording"; filename="test4_multiform.mp3"
Content-Type: audio/mpeg

ID3ETT2test4_multiformCOMengiTunPGAP0TENiTunes 12.3.0.44COMhengiTunNORM 00000152 00000152 000013BE 000013BE 0000023E 0000023E 00003F10 00003F10 000002A7 000002A7COMengiTunSMPB 00000000 00000210 00000A30 0000000000015BC0 00000000 0
--- the rest of the recording ---

服务器端处理程序:

    @Path(value = "multipart")
    @POST
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    @Produces(MediaType.APPLICATION_JSON)
    public Response receiveFileAndMetadataAsMultipart(
            @FormDataParam(RECORDING) InputStream recordingIinputStream,
            @FormDataParam(RECORDING) FormDataContentDisposition callRecordingDispositionHeader,
            @FormDataParam(QUEUE) String queue,
            @FormDataParam(DATETIME) String datetime) throws JSONException, ParseException, IOException {

        //do stuff with my recording and metadata
        //...

        JSONObject response = new JSONObject();
        return Response.status(Response.Status.OK).entity(response).build();
    }

当我尝试只发送文件,内容类型不是多部分/表单数据,而是应用程序/八位流,然后它工作正常。(我的意思不是这个处理程序,而是一个接受八位流的处理程序),尽管请求非常相似。我也会发布八位字节流的请求和代码,也许会有所帮助:

PUT /rest/myapi/recording HTTP/1.1
Accept: application/json
Accept-Language: en-US
Content-Type: application/octet-stream
Cookie: JSESSIONID=a5f5cfa7329142158766a6182645; JSESSIONIDSSO=BAFA3371F6D14A179B0BA6216DD6C119
Host: localhost:8181
Connection: close
User-Agent: Paw/2.2.2 (Macintosh; OS X/10.10.5) GCDHTTPRequest
Content-Length: 55414

ID3BTT2test3_2callsCOMengiTunPGAP0TENiTunes 12.3.0.44COMhengiTunNORM 0000038A 0000038A 00001B3D 00001B3D
--- the rest of the recording ---

方法:

    @Path(value = "recording")
    @PUT
    @Consumes(MediaType.APPLICATION_OCTET_STREAM)
    @Produces(MediaType.APPLICATION_JSON)
    public Response receiveRecording(InputStream callRecordingInputStream) throws IOException, JSONException {

        //do stuff with my recording
        //...

        JSONObject response = new JSONObject();              
        return Response.status(Response.Status.OK).entity(response).build();
    }

有人知道出了什么问题吗?我在网上的几个地方找到了这种多部分的方法,所以我想应该这样做。

顺便说一句,我也试图删除所有的元数据,只是发送录音,但问题是一样的。

共有1个答案

胡承载
2023-03-14

多亏@peeskillet的评论,我才发现了这个问题,所以为了防止同样的事情发生在其他人身上:

我有一个错误的导入FormDataContentDisplace。

错误:

import com.sun.jersey.core.header.FormDataContentDisposition;

正确:

import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
 类似资料:
  • 我在Jersey写了一个Rest服务来上传多个文件。如下图所示。但是我需要Restservice类中的属性名,即name=“metadata”和name=“file”。 选择XML文件1: 选择PDF文件2: FormDataContentDisposition仅从表单中提取内容类型、文件名,而不是输入类型名称=“属性。 任何帮助都将不胜感激。 我张贴使用超文本标记语言的请求如下所示。 也发布HT

  • 在将FreshDesk集成到我的产品中时,我被用附件API创建票证所困扰。我使用高级Rest客户端测试API。我已经看到了许多关于栈溢出本身的论坛和问题,但我仍然对任何关于上传文件的多部分形式数据POST请求的回答不满意。 我想知道Advanced Rest Client中所需的请求格式以及标题 到目前为止,这是我正在使用的请求,但我没有得到正确的响应:

  • 我正在尝试在 Java 应用程序中设置一个 Apache Camel 路由,其中使用者终结点是一个 restlet 组件,它将 HTTP 文件上传作为多部分表单数据的 POST 进行处理,然后创建者终结点将请求转发到也接受多部分表单数据的 rest 服务。我是骆驼的新手,不知道如何正确地连接它。以下是到目前为止我的路线。我是否需要对正文进行任何转换,还是会按原样转发多部分表单数据?有人可以为我提供

  • 我仍然对上传文件的不同方法感到困惑。后端服务器不在我的控制之下,但我可以使用Swagger page或Postman上传文件。这意味着服务器运行正常。但当我使用AngularJS进行上传时,它不起作用。 以下是使用Postman进行测试的方法。我只是在使用表单数据: 请注意,请求头的内容类型为多部分/表单数据。但是请求负载具有文件名和内容类型,即image/png。 这是我的代码: 参数只是图像数

  • 客户(ReactJS/Axios): Multer中间件: 下一个(): 异步(req,res)= 此处req.file未定义! } 当我尝试使用Axios传递图像时,req.file在控制器中显示为未定义。 我认为错误是在传递多部分/表单数据时,因为当我通过Insonmia Rest执行此操作时,它会工作!

  • 我正在创建一个API上传文件使用泽西。 } } 当我执行curl-v-X POST时——form file=@rt.txt url 我哪里做错了?