javahttponedrivemultipartentity

Multipart File upload using Apache REST client


I was trying to upload files to OneDrive using multipart request. I've tried many ways but none of them worked.

The request is of the form :-

POST /drive/items/{folder-id}/children
Content-Type: multipart/related; boundary="A100x"

--A100x
Content-ID: <metadata>
Content-Type: application/json

{
  "name": "newfile.txt",
  "file": {},
  "@content.sourceUrl": "cid:content",
  "@name.conflictBehavior": "rename"
}

--A100x
Content-ID: <content>
Content-Type: text/plain

Contents of the file to be uploaded.

--A100x--

I've tried many ways. The snippet I've done for this added below. Any help would be appreciated.

Snippet :-

            HttpClient httpClient = HttpClientBuilder.create().build();
            URIBuilder uriBuilder = new URIBuilder(URI);
            HttpPost post = new HttpPost(uriBuilder.build());
            MultipartEntityBuilder builder = MultipartEntityBuilder.create();
            builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
            Charset chars = Charset.forName("utf-8");
            builder.setCharset(chars);
            post.setEntity(builder.build());
            builder.addPart("content", new FileBody(new File("/home/myfiles/test"), ContentType.APPLICATION_OCTET_STREAM, "test"));
            builder.addPart("metadata", new StringBody(metaJson, ContentType.APPLICATION_JSON));
            post.setHeader("Content-Type", "multipart/form-data");
            post.addHeader("Authorization", "Bearer " + ACCESS_TOKEN);
            try {
                HttpResponse response = httpClient.execute(post);
                if (response.getStatusLine().getStatusCode() == 200) {
                    br = new BufferedReader(new InputStreamReader((response.getEntity().getContent())));
                    responseBuilder = new StringBuilder();
                    while ((output = br.readLine()) != null) {
                        responseBuilder.append(output);
                    }
                } else {
                    System.out.println("Failed : HTTP error code : " + response.getStatusLine().getStatusCode());
                }
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

URI :

https://api.onedrive.com/v1.0/drive/root:/myfiles/children


Solution

  • Later on I realized that I can use simple file upload provided my files are simple doc files. And achieved solution using Apache REST client.

    Code snippet :-

        BufferedReader br = null;
        String output;
        StringBuilder responseBuilder = null;
        HttpClient httpClient = HttpClientBuilder.create().build();
        URIBuilder uriBuilder = new URIBuilder(<UPLOAD_URL>);
        HttpPut request = new HttpPut(uriBuilder.build());
        request.addHeader("Authorization", "Bearer " + oneDriveConnection.getAccessToken());
        request.addHeader("Content-Type", mimeType);
        HttpEntity entity = new ByteArrayEntity(bytes);
        request.setEntity(entity);
        HttpResponse response = httpClient.execute(request);
        int responseCode = response.getStatusLine().getStatusCode();
        if (responseCode == 201 || responseCode == 200) {
            br = new BufferedReader(new InputStreamReader((response.getEntity().getContent())));
            responseBuilder = new StringBuilder();
            while ((output = br.readLine()) != null) {
                responseBuilder.append(output);
            }
        } else {
            logger.error("Failed : HTTP error code : " + response.getStatusLine().getStatusCode());
            throw new UploadException("Upload failure, Status code : " + response.getStatusLine().getStatusCode());
        }