I am trying to upload 256KB chunks to Google Drive using the REST API v3. I can successfully get the upload id, but when I use this upload id to download the piece, I get 400 Bad Request instead of 308. I am sending the code below. The getUploadID () method initiates a resumed download session, and the putFileWithUploadID () method should load a piece of the file, but there seems to be a problem in it. I wrote the code according to the official guide .
String mUploadID; private String getUploadID(Uri fileUri, String token) { String upload_id = ""; java.io.File fileContent = new java.io.File(fileUri.getPath()); String fileName = fileContent.getName(); String mimeType = "audio/mpeg"; try { String url = "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable"; URL obj = new URL(url); HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); con.setRequestMethod("POST"); con.setDoInput(true); con.setDoOutput(true); con.setRequestProperty("Authorization", "Bearer " + token); con.setRequestProperty("X-Upload-Content-Type", mimeType); con.setRequestProperty("X-Upload-Content-Length", String.format(Locale.ENGLISH, "%d", fileContent.length())); con.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); String body = "{\"name\": \"" + fileName + "\", \"parents\": [\"" + "0B7ypsm4HGZhCS3FXcldPZnFPNkE" + "\"]}"; con.setRequestProperty("Content-Length", String.format(Locale.ENGLISH, "%d", body.getBytes().length)); OutputStream outputStream = con.getOutputStream(); outputStream.write(body.getBytes()); outputStream.close(); con.connect(); String location = con.getHeaderField("Location"); if (location.contains("upload_id")) { String[] uploadParameters = location.split("upload_id"); upload_id = uploadParameters[1].replace("=", ""); } } catch (Exception e) { e.printStackTrace(); } return upload_id; } private void putFileWithUploadID(Uri fileUri, String token, long range) { java.io.File fileContent = new java.io.File(fileUri.getPath()); String fileName = fileContent.getName(); String contentLength = String.valueOf(fileContent.length()); String mimeType = "audio/mpeg"; long totalBytesFromDataInputStream = 0; long uploadedBytes = 0; long chunkStart = 0; long chunkSize = 262144; do { try { String url = "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable&upload_id=" + mUploadID; URL obj = new URL(url); HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); con.setRequestMethod("PUT"); con.setDoOutput(true); con.setConnectTimeout(10000); con.setRequestProperty("Content-Type", mimeType); uploadedBytes = chunkSize; if (chunkStart + uploadedBytes > fileContent.length()) { uploadedBytes = (int) fileContent.length() - chunkStart; } con.setRequestProperty("Content-Length", String.format(Locale.ENGLISH, "%d", uploadedBytes)); con.setRequestProperty("Content-Range", "bytes " + chunkStart + "-" + (chunkStart + uploadedBytes - 1) + "/" + fileContent.length()); byte[] buffer = new byte[(int) uploadedBytes]; FileInputStream fileInputStream = new FileInputStream(fileContent); fileInputStream.getChannel().position(chunkStart); if (fileInputStream.read(buffer, 0, (int) uploadedBytes) == -1) { break; } fileInputStream.close(); OutputStream outputStream = con.getOutputStream(); outputStream.write(buffer); outputStream.close(); con.connect(); int responseCode = con.getResponseCode(); String rangeHeader = con.getHeaderField("Range"); if (rangeHeader!=null) { chunkStart = Long.parseLong(rangeHeader.substring(rangeHeader.lastIndexOf("-") + 1, rangeHeader.length())) + 1; } } catch (Exception e) { e.printStackTrace(); } } while ((chunkStart+chunkSize)<fileContent.length()); }
source share