使用okHttp上传图片
Posted
技术标签:
【中文标题】使用okHttp上传图片【英文标题】:Image upload using 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;
提前致谢。
【问题讨论】:
【参考方案1】:你需要使用
new MultipartBody.Builder()
代替
new MultipartBuilder()
它的工作原理
【讨论】:
对我的问题有任何想法,有一个类似的问题,它的赏金:***.com/questions/57598276/…【参考方案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 知道如何在服务器中接收此请求的数据
【讨论】:
这里的路径是什么? 它的文件对象。以上是关于使用okHttp上传图片的主要内容,如果未能解决你的问题,请参考以下文章