CXF拦截器 - 将请求主体转换为附件

时间:2013-12-12 14:56:05

标签: java apache request cxf attachment

我遇到的问题是,某些与我的API集成的客户端不符合标准(当然:))。

因此,一些客户端而不是添加文件附件是在请求正文中发送文件的内容(具有错误的标头)。这会导致CXF异常(无法找到边界)。

我已经实现了一个InInterceptor来检查内容。首先我已经更改了内容类型,否则CXF会返回415错误。

我现在如何将纯文本输入请求正文转换为附件?

@Override
public void handleMessage(Message message) throws Fault {
    Map<String,List> map = (Map<String, List>)message.get(Message.PROTOCOL_HEADERS);
    if(url != null && url.indexOf("uploadFile") > 0) { //TODO && !Content-type = multipart/form-data
        message.remove(Message.CONTENT_TYPE);
        message.put(Message.CONTENT_TYPE, "multipart/form-data");
        map.put("content-type", Collections.singletonList("multipart/form-data"));
        message.put(Message.PROTOCOL_HEADERS, map);
    }

    InputStream is = message.getContent(InputStream.class);
    StringWriter writer = new StringWriter();
    try {
        IOUtils.copy(is, writer, "UTF-8");
        is.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    String requestBody = writer.toString();
    System.out.println(requestBody);
}

我注意到,如果请求是正确的(文件附加),输入请求看起来像这样(注意边界字符串):

--g-fcgqFfRThi-YWVLasSjj8mvL2PJecFQq
Content-Disposition: form-data; name="upload__31e8f749_142e740a2c1__7fff_00000040.tmp"; filename="upload__31e8f749_142e740a2c1__7fff_00000040.tmp"
Content-Type: application/octet-stream; charset=ISO-8859-1
Content-Transfer-Encoding: binary

FILE CONTENT

--g-fcgqFfRThi-YWVLasSjj8mvL2PJecFQq--

如果它不正确(请求正文中的纯文本),输入流就是这样:

FILE CONTENT

然后这会导致“未找到边界异常”。当然,我现在在这段代码中得到“Stream closed”异常,但这只是因为我处于寻找解决方案的模式。

0 个答案:

没有答案