How to use okhttp to download a file?

I am using okhttp for my httpclient. I think this is a good api, but the document is not so detailed.

how to use it to create http mail request with file upload?

public Multipart createMultiPart(File file){ Part part = (Part) new Part.Builder().contentType("").body(new File("1.png")).build(); //how to set part name? Multipart m = new Multipart.Builder().addPart(part).build(); return m; } public String postWithFiles(String url,Multipart m) throws IOException{ ByteArrayOutputStream out = new ByteArrayOutputStream(); m.writeBodyTo(out) ; Request.Body body = Request.Body.create(MediaType.parse("application/x-www-form-urlencoded"), out.toByteArray()); Request req = new Request.Builder().url(url).post(body).build(); return client.newCall(req).execute().body().string(); } 

my question is:

  • How to set the name of the part? in the form, the file must be named file1.
  • How to add other fields to the form?
+30
java android mimecraft
May 7 '14 at 8:25
source share
6 answers

Note: this answer is for ohtp 1.x / 2.x. For 3.x see this other answer .

The Multipart class from mimecraft encapsulates the entire HTTP body and can handle regular fields as follows:

 Multipart m = new Multipart.Builder() .type(Multipart.Type.FORM) .addPart(new Part.Builder() .body("value") .contentDisposition("form-data; name=\"non_file_field\"") .build()) .addPart(new Part.Builder() .contentType("text/csv") .body(aFile) .contentDisposition("form-data; name=\"file_field\"; filename=\"file1\"") .build()) .build(); 

Take a look at multipart / form-data encoding examples to understand how you need to create parts.

When you have a Multipart object, all that remains to be done is to specify the correct Content-Type header and pass the body bytes to the request.

Since you seem to be working with the vH 2.0 OkHttp API, with which I have no experience, this is just an assumption code:

 // You'll probably need to change the MediaType to use the Content-Type // from the multipart object Request.Body body = Request.Body.create( MediaType.parse(m.getHeaders().get("Content-Type")), out.toByteArray()); 

For OkHttp 1.5.4, here is the stripped-down code that I use, which is adapted from the sample snippet :

 OkHttpClient client = new OkHttpClient(); OutputStream out = null; try { URL url = new URL("http://www.example.com"); HttpURLConnection connection = client.open(url); for (Map.Entry<String, String> entry : multipart.getHeaders().entrySet()) { connection.addRequestProperty(entry.getKey(), entry.getValue()); } connection.setRequestMethod("POST"); // Write the request. out = connection.getOutputStream(); multipart.writeBodyTo(out); out.close(); // Read the response. if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { throw new IOException("Unexpected HTTP response: " + connection.getResponseCode() + " " + connection.getResponseMessage()); } } finally { // Clean up. try { if (out != null) out.close(); } catch (Exception e) { } } 
+15
May 21 '14 at 13:21
source

Here is a basic function that uses okhttp to upload a file and some arbitrary field (literally mimics the regular submission of an HTML form)

Change the MIME type to match your file (here I assume .csv) or make it a function parameter if you intend to upload files of different types.

  public static Boolean uploadFile(String serverURL, File file) { try { RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM) .addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("text/csv"), file)) .addFormDataPart("some-field", "some-value") .build(); Request request = new Request.Builder() .url(serverURL) .post(requestBody) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(final Call call, final IOException e) { // Handle the error } @Override public void onResponse(final Call call, final Response response) throws IOException { if (!response.isSuccessful()) { // Handle the error } // Upload successful } }); return true; } catch (Exception ex) { // Handle the error } return false; } 

Note: since this is an asynchronous call, the logical return type does not indicate a successful download, but only that the request was sent to the okhttp queue.

+35
May 28 '15 at 6:11
source

Here is the answer that works with OkHttp 3.2.0:

 public void upload(String url, File file) throws IOException { OkHttpClient client = new OkHttpClient(); RequestBody formBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("text/plain"), file)) .addFormDataPart("other_field", "other_field_value") .build(); Request request = new Request.Builder().url(url).post(formBody).build(); Response response = client.newCall(request).execute(); } 
+27
Apr 27 '16 at 20:06
source
 OkHttpClient client = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).writeTimeout(180, TimeUnit.SECONDS).readTimeout(180, TimeUnit.SECONDS).build(); RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) .addFormDataPart("File", path.getName(),RequestBody.create(MediaType.parse("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"),path)) .addFormDataPart("username", username) .addFormDataPart("password", password) .build(); Request request = new Request.Builder().url(url).post(body).build(); Response response = client.newCall(request).execute(); result = response.body().string(); 

Above the code will send username, password as the post parameter, and the file will be uploaded under the name "File".

PHP server will receive files

  if (isset($_FILES["File"]) && isset($_POST['username']) && isset($_POST['password'])) { //All Values found }else{ echo 'please send the required data'; } 
+3
Jun 16 '17 at 6:05
source

I created a cool helper class for OkHttp3 . it's here

 public class OkHttp3Helper { public static final String TAG; private static final okhttp3.OkHttpClient client; static { TAG = OkHttp3Helper.class.getSimpleName(); client = new okhttp3.OkHttpClient.Builder() .readTimeout(7, TimeUnit.MINUTES) .writeTimeout(7, TimeUnit.MINUTES) .build(); } private Context context; public OkHttp3Helper(Context context) { this.context = context; } /** * <strong>Uses:</strong><br/> * <p> * {@code * ArrayMap<String, String> formField = new ArrayMap<>();} * <br/> * {@code formField.put("key1", "value1");}<br/> * {@code formField.put("key2", "value2");}<br/> * {@code formField.put("key3", "value3");}<br/> * <br/> * {@code String response = helper.postToServer("http://www.example.com/", formField);}<br/> * </p> * * @param url String * @param formField android.support.v4.util.ArrayMap * @return response from server in String format * @throws Exception */ @NonNull public String postToServer(@NonNull String url, @Nullable ArrayMap<String, String> formField) throws Exception { okhttp3.Request.Builder requestBuilder = new okhttp3.Request.Builder().url(url); if (formField != null) { okhttp3.FormBody.Builder formBodyBuilder = new okhttp3.FormBody.Builder(); for (Map.Entry<String, String> entry : formField.entrySet()) { formBodyBuilder.add(entry.getKey(), entry.getValue()); } requestBuilder.post(formBodyBuilder.build()); } okhttp3.Request request = requestBuilder.build(); okhttp3.Response response = client.newCall(request).execute(); if (!response.isSuccessful()) { throw new IOException(response.message()); } return response.body().string(); } /** * <strong>Uses:</strong><br/> * <p> * {@code * ArrayMap<String, String> formField = new ArrayMap<>();} * <br/> * {@code formField.put("key1", "value1");}<br/> * {@code formField.put("key2", "value2");}<br/> * {@code formField.put("key3", "value3");}<br/> * <br/> * {@code * ArrayMap<String, File> filePart = new ArrayMap<>();} * <br/> * {@code filePart.put("key1", new File("pathname"));}<br/> * {@code filePart.put("key2", new File("pathname"));}<br/> * {@code filePart.put("key3", new File("pathname"));}<br/> * <br/> * {@code String response = helper.postToServer("http://www.example.com/", formField, filePart);}<br/> * </p> * * @param url String * @param formField android.support.v4.util.ArrayMap * @param filePart android.support.v4.util.ArrayMap * @return response from server in String format * @throws Exception */ @NonNull public String postMultiPartToServer(@NonNull String url, @Nullable ArrayMap<String, String> formField, @Nullable ArrayMap<String, File> filePart) throws Exception { okhttp3.Request.Builder requestBuilder = new okhttp3.Request.Builder().url(url); if (formField != null || filePart != null) { okhttp3.MultipartBody.Builder multipartBodyBuilder = new okhttp3.MultipartBody.Builder(); multipartBodyBuilder.setType(okhttp3.MultipartBody.FORM); if (formField != null) { for (Map.Entry<String, String> entry : formField.entrySet()) { multipartBodyBuilder.addFormDataPart(entry.getKey(), entry.getValue()); } } if (filePart != null) { for (Map.Entry<String, File> entry : filePart.entrySet()) { File file = entry.getValue(); multipartBodyBuilder.addFormDataPart( entry.getKey(), file.getName(), okhttp3.RequestBody.create(getMediaType(file.toURI()), file) ); } } requestBuilder.post(multipartBodyBuilder.build()); } okhttp3.Request request = requestBuilder.build(); okhttp3.Response response = client.newCall(request).execute(); if (!response.isSuccessful()) { throw new IOException(response.message()); } return response.body().string(); } private okhttp3.MediaType getMediaType(URI uri1) { Uri uri = Uri.parse(uri1.toString()); String mimeType; if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) { ContentResolver cr = context.getContentResolver(); mimeType = cr.getType(uri); } else { String fileExtension = MimeTypeMap.getFileExtensionFromUrl(uri .toString()); mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension( fileExtension.toLowerCase()); } return okhttp3.MediaType.parse(mimeType); } } 
+1
Dec 08 '16 at 22:33
source

The perfect code to upload any files to Google Drive along with file metadata is easy.

  String url = String.format("https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart"); //String url = String.format("https://www.googleapis.com/upload/drive/v2/files?uploadType=resumable"); boolean status; String metaDataFile = "{\"title\":\"" + step.getFile_name() + "\"," + "\"description\":\"" + step.getDescription() + "\"," + "\"parents\":[{\"id\":\"" + step.getFolderId() + "\"}]," + "\"capabilities\":{\"canEdit\":\"" + false + "\", \"canDownload\":\" "+ false +" \" }, " + "\"type\":\"" + step.getFile_access() + "\"" + "}"; //get the encoded byte data for decode byte[] file = Base64.decodeBase64(step.getFile_data()); //attaching metadata to our request object RequestBody requestBodyMetaData = RequestBody.create(MediaType.parse("application/json"), metaDataFile); //passing both meta data and file content for uploading RequestBody requestBodyMultipart = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("metadata", null, requestBodyMetaData) .addFormDataPart("file", null, RequestBody.create(MediaType.parse("application/octet-stream"), file)) .build(); Request request = new Request.Builder() .url(url) .addHeader("Authorization", String.format("Bearer %s", step.getAccess_token())) .post(requestBodyMultipart) .build(); OkHttpClient okHttpClient = new OkHttpClient(); try { // Get response after rest call. Response response = okHttpClient.newCall(request).execute(); status = response.code() == 200 ? true : false; map.put(step.getOutput_variable(), response.code()); 
+1
Jan 22 '19 at 10:12
source



All Articles