【问题标题】:Image upload using okHttp使用okHttp上传图片
【发布时间】:2016-06-07 22:54:15
【问题描述】:

我想使用 okhttp 上传图片,但我找不到用于 Post Image 的 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;
}

提前致谢。

【问题讨论】:

    标签: android image upload okhttp


    【解决方案1】:

    你需要使用

    new MultipartBody.Builder()
    

    代替

    new MultipartBuilder()
    

    它的工作原理

    【讨论】:

    【解决方案2】:

    这里是多部分请求类。

    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;
      }
    }
    

    希望对您有所帮助。

    注意:如果您使用的是低于版本 3 的旧 OkHttp,则可以使用此方法。如果您使用的是版本 3 或更高版本here is the answer for you

    【讨论】:

      【解决方案3】:

      我在OKHTTP 3.4.1中使用了这种方式

      这样调用函数

      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();
                  }
      
              }
          }
      

      【讨论】:

        【解决方案4】:
        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();
        

        Click here 知道如何在服务器中接收此请求的数据

        【讨论】:

        • 这里的路径是什么?
        • 它的文件对象。
        猜你喜欢
        • 1970-01-01
        • 2016-06-29
        • 2019-03-24
        • 2014-09-23
        • 1970-01-01
        • 2021-03-19
        • 2015-08-01
        • 2015-11-25
        • 2015-12-25
        相关资源
        最近更新 更多