使用okHttp上传图片
我想要使用okhttp上传图片,但我无法find后期Image.What MultipartBuilder,而不是这个。
这是我的代码
public static JSONObject uploadImage(File file) { try { final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png"); RequestBody req = new MultipartBuilder().setType(MultipartBody.FORM).addFormDataPart("userid", "8457851245") .addFormDataPart("userfile","profile.png", RequestBody.create(MEDIA_TYPE_PNG, file)).build(); Request request = new Request.Builder() .url("url") .post(req) .build(); OkHttpClient client = new OkHttpClient(); Response response = client.newCall(request).execute(); Log.d("response", "uploadImage:"+response.body().string()); return new JSONObject(response.body().string()); } catch (UnknownHostException | UnsupportedEncodingException e) { Log.e(TAG, "Error: " + e.getLocalizedMessage()); } catch (Exception e) { Log.e(TAG, "Other Error: " + e.getLocalizedMessage()); } return null; }
提前致谢。
你需要使用
Multipartbody.Builder()
代替
MultipartBuilder
它的工作
这是多部分请求类。
import java.io.File; import java.io.IOException; import org.apache.http.HttpStatus; import android.content.Context; import com.esp.ro.util.Config; import com.esp.ro.util.Log; import com.squareup.okhttp.MediaType; import com.squareup.okhttp.MultipartBuilder; import com.squareup.okhttp.OkHttpClient; import com.squareup.okhttp.Request; import com.squareup.okhttp.RequestBody; import com.squareup.okhttp.Response; public class MultipartRequest { public Context caller; public MultipartBuilder builder; private OkHttpClient client; public MultipartRequest(Context caller) { this.caller = caller; this.builder = new MultipartBuilder(); this.builder.type(MultipartBuilder.FORM); this.client = new OkHttpClient(); } public void addString(String name, String value) { this.builder.addFormDataPart(name, value); } public void addFile(String name, String filePath, String fileName) { this.builder.addFormDataPart(name, fileName, RequestBody.create( MediaType.parse("image/jpeg"), new File(filePath))); } public void addTXTFile(String name, String filePath, String fileName) { this.builder.addFormDataPart(name, fileName, RequestBody.create( MediaType.parse("text/plain"), new File(filePath))); } public void addZipFile(String name, String filePath, String fileName) { this.builder.addFormDataPart(name, fileName, RequestBody.create( MediaType.parse("application/zip"), new File(filePath))); } public String execute(String url) { RequestBody requestBody = null; Request request = null; Response response = null; int code = 200; String strResponse = null; try { requestBody = this.builder.build(); request = new Request.Builder().header("AUTH-KEY", Config.API_KEY) .url(url).post(requestBody).build(); Log.print("::::::: REQ :: " + request); response = client.newCall(request).execute(); Log.print("::::::: response :: " + response); if (!response.isSuccessful()) throw new IOException(); code = response.networkResponse().code(); if (response.isSuccessful()) { strResponse = response.body().string(); } else if (code == HttpStatus.SC_NOT_FOUND) { // ** "Invalid URL or Server not available, please try again" */ strResponse = caller.getResources().getString( R.string.error_invalid_URL); } else if (code == HttpStatus.SC_REQUEST_TIMEOUT) { // * "Connection timeout, please try again", */ strResponse = caller.getResources().getString( R.string.error_timeout); } else if (code == HttpStatus.SC_SERVICE_UNAVAILABLE) { // * // "Invalid URL or Server is not responding, please try again", // */ strResponse = caller.getResources().getString( R.string.error_server_not_responding); } } catch (Exception e) { Log.error("Exception", e); Log.print(e); } finally { requestBody = null; request = null; response = null; builder = null; if (client != null) client = null; System.gc(); } return strResponse; } }
希望这对你有所帮助。
注意:如果你使用的是旧版本的OkHttp,那么你可以使用这个方法。如果你使用的是版本3或者更高的版本, 这里是你的答案 。
我在OKHTTP 3.4.1中使用了这种方法
调用这样的function
if (!realPath.equals("")) { new SignupWithImageTask().execute(et_name.getText().toString(), et_email.getText().toString(), et_dob.getText().toString(), IMEI, et_mobile.getText().toString(), realPath); } else { Toast.makeText(this, "Profile Picture not found", Toast.LENGTH_SHORT).show(); }
SignupWithImageTask
public class SignupWithImageTask extends AsyncTask<String, Integer, String> { ProgressDialog progressDialog; @Override protected void onPreExecute() { super.onPreExecute(); progressDialog = new ProgressDialog(SignupActivity.this); progressDialog.setMessage("Please Wait...."); progressDialog.show(); } @Override protected String doInBackground(String... str) { String res = null; try { // String ImagePath = str[0]; String name = str[0], email = str[1], dob = str[2], IMEI = str[3], phone = str[4], ImagePath = str[5]; File sourceFile = new File(ImagePath); Log.d("TAG", "File...::::" + sourceFile + " : " + sourceFile.exists()); final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/*"); String filename = ImagePath.substring(ImagePath.lastIndexOf("/") + 1); /** * OKHTTP2 */ // RequestBody requestBody = new MultipartBuilder() // .type(MultipartBuilder.FORM) // .addFormDataPart("member_id", memberId) // .addFormDataPart("file", "profile.png", RequestBody.create(MEDIA_TYPE_PNG, sourceFile)) // .build(); /** * OKHTTP3 */ RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("image", filename, RequestBody.create(MEDIA_TYPE_PNG, sourceFile)) .addFormDataPart("result", "my_image") .addFormDataPart("name", name) .addFormDataPart("email", email) .addFormDataPart("dob", dob) .addFormDataPart("IMEI", IMEI) .addFormDataPart("phone", phone) .build(); Request request = new Request.Builder() .url(BASE_URL + "signup") .post(requestBody) .build(); OkHttpClient client = new OkHttpClient(); okhttp3.Response response = client.newCall(request).execute(); res = response.body().string(); Log.e("TAG", "Response : " + res); return res; } catch (UnknownHostException | UnsupportedEncodingException e) { Log.e("TAG", "Error: " + e.getLocalizedMessage()); } catch (Exception e) { Log.e("TAG", "Other Error: " + e.getLocalizedMessage()); } return res; } @Override protected void onPostExecute(String response) { super.onPostExecute(response); if (progressDialog != null) progressDialog.dismiss(); if (response != null) { try { JSONObject jsonObject = new JSONObject(response); if (jsonObject.getString("message").equals("success")) { JSONObject jsonObject1 = jsonObject.getJSONObject("data"); SharedPreferences settings = getSharedPreferences("preference", 0); // 0 - for private mode SharedPreferences.Editor editor = settings.edit(); editor.putString("name", jsonObject1.getString("name")); editor.putString("userid", jsonObject1.getString("id")); editor.putBoolean("hasLoggedIn", true); editor.apply(); new UploadContactTask().execute(); startActivity(new Intent(SignupActivity.this, MainActivity.class)); } else { Toast.makeText(SignupActivity.this, "" + jsonObject.getString("message"), Toast.LENGTH_SHORT).show(); } } catch (JSONException e) { e.printStackTrace(); } } else { Toast.makeText(SignupActivity.this, "Something Went Wrong", Toast.LENGTH_SHORT).show(); } } }
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();
点击此处了解如何接收服务器中的数据以获取此请求