简体   繁体   中英

How to remove request header from HttpEntity while uploading file

I am trying to send some message to mft server via REST API, and I'm using MultipartHttpEntityBuilder to build the message but along with original message some unwanted header and additional data is also getting attached. I found similar issue MultipartEntityBuilder: Omit Content-Type and Content-Transfer , but it was helpful.

My Code snippet :

HttpPut putRequest = new HttpPut(MFTSERVER_REST_LINK);

MultipartEntityBuilder builder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.BROWSER_COMPATIBLE);        
builder.addBinaryBody("something","<head><content>xyz</content></head>".getBytes(), ContentType.APPLICATION_XML,"fileName");
HttpEntity httpEntity = builder.build();
putRequest.setEntity(httpEntity) ;

httpClient.execute(putRequest);

Expected content to be written to file :

<head><content>xyz</content></head>

But, actually written to file :

--p13fxV0SO5Y6zSxYnGPJlfGPgX8snL
Content-Disposition: form-data; name="something"; filename="fileName"
Content-Type: application/xml; charset=ISO-8859-1

<head><content>xyz</content></head>
--p13fxV0SO5Y6zSxYnGPJlfGPgX8snL--

Can someone help me to solve this issue ?

If you are going to write Byte data in your post body. Then, you should use ByteArrayEntity instead of MultipartEntityBuilder . Because, with doWriteTo method in AbstractMultipartForm . There is no way you can remove or skip unwanted header to be written to file.

 void doWriteTo(
        final OutputStream out,
        final boolean writeContent) throws IOException {

        final ByteArrayBuffer boundary = encode(this.charset, getBoundary());
        for (final FormBodyPart part: getBodyParts()) {
            writeBytes(TWO_DASHES, out);
            writeBytes(boundary, out);
            writeBytes(CR_LF, out);

            formatMultipartHeader(part, out);

            writeBytes(CR_LF, out);

            if (writeContent) {
                part.getBody().writeTo(out);
            }
            writeBytes(CR_LF, out);
        }
        writeBytes(TWO_DASHES, out);
        writeBytes(boundary, out);
        writeBytes(TWO_DASHES, out);
        writeBytes(CR_LF, out);
    }

You could see, the list of elements which ware getting written to outputstream are boundary, header, body and then boundary again in sequence. So, if you wanted to write some content with bytes. Then, you should use ByteArrayEntity .

byte[] b = "This is hello".getBytes("UTF-8");
putRequest.setEntity(new ByteArrayEntity(b));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM