使用okHttp上传图片

23

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

提前感谢。

4个回答

13
你需要使用 <\p>
new MultipartBody.Builder()

与其

new MultipartBuilder()

它正在工作


你有没有想法关于我的问题?或者是否遇到过类似的问题并且可以获得赏金?链接如下:https://stackoverflow.com/questions/57598276/how-do-i-pass-a-multi-part-body-parameter-for-rxjava2-androidnetworking-post-req - user11455292

8
这是多部分请求类。
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或更高版本,则这里有你需要的答案


6

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

注册带图片任务

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

        }
    }

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

点击这里 了解如何在服务器上接收此请求的数据


这里的路径是什么? - Mateen Chaudhry
它的文件对象。 - Vignesh KM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接