2015-05-20 3 views
8

Im заканчивает этот проект, который использует okhttp для связи с webservice.Загрузка файла с помощью okhttp

Все идет нормально для обычных GET и POST, но я не могу правильно загрузить файл.

Документы okhttp очень не хватает по этим предметам, и все, что я нашел здесь или где-то, похоже, не работает в моем случае.

Это должно быть просто: мне нужно отправить как файл, так и некоторые строковые значения. Но я не могу понять, как это сделать.

После некоторых образцов, которые я нашел, я впервые попробовал это:

RequestBody requestBody = new MultipartBuilder().type(MultipartBuilder.FORM) 
    .addFormDataPart("group", getGroup()) 
    .addFormDataPart("type", getType()) 
    .addFormDataPart("entity", Integer.toString(getEntity())) 
    .addFormDataPart("reference", Integer.toString(getReference())) 
    .addPart(Headers.of("Content-Disposition", "form-data; name=\"task_file\""), RequestBody.create(MediaType.parse("image/png"), getFile())) 
    .build(); 

Это дает мне ошибку «400 плохой запрос».

Так что я попытался это из okhttp рецептов:

RequestBody requestBody = new MultipartBuilder().type(MultipartBuilder.FORM) 
    .addPart(Headers.of("Content-Disposition", "form-data; name=\"group\""), RequestBody.create(null, getGroup())) 
    .addPart(Headers.of("Content-Disposition", "form-data; name=\"type\""), RequestBody.create(null, getType())) 
    .addPart(Headers.of("Content-Disposition", "form-data; name=\"entity\""), RequestBody.create(null, Integer.toString(getEntity()))) 
    .addPart(Headers.of("Content-Disposition", "form-data; name=\"reference\""), RequestBody.create(null, Integer.toString(getReference()))) 
    .addPart(Headers.of("Content-Disposition", "form-data; name=\"task_file\""), RequestBody.create(MediaType.parse("image/png"), getFile())) 
    .build(); 

Тот же результат.

Не знаю, что еще попробовать или что задумать, чтобы отладить это.

Запрос делается с этим кодом:

// adds the required authentication token 
Request request = new Request.Builder().url(getURL()).addHeader("X-Auth-Token", getUser().getToken().toString()).post(requestBody).build(); 
Response response = client.newCall(request).execute(); 

Но Im уверен, что проблема заключается в том, как Im построения тела запроса.

Что я делаю неправильно?

EDIT: «getFile()» выше возвращает объект File, кстати. Остальными параметрами являются все строки и ints.

ответ

20

Я нашел ответ на свой вопрос после первого сообщения.

я буду оставить его здесь, потому что это может быть полезным для других, учитывая, что есть такие несколько примеров загружать okhttp вокруг:

RequestBody requestBody = new MultipartBuilder().type(MultipartBuilder.FORM) 
     .addFormDataPart("group", getGroup()) 
     .addFormDataPart("type", getType()) 
     .addFormDataPart("entity", Integer.toString(getEntity())) 
     .addFormDataPart("reference", Integer.toString(getReference())) 
     .addFormDataPart("task_file", "file.png", RequestBody.create(MediaType.parse("image/png"), getFile())) 
               .build(); 

Там нет оснований использовать «addPart» с «Headers .of "и т. д., как в рецептах, addFormDataPart делает трюк.

И для самого поля файла он принимает 3 аргумента: имя, имя файла, а затем тело файла. Вот и все.

+0

спасибо diogo.abdalla, это разбудило меня .. –

+0

У меня была та же проблема ... интересно, почему Рецепты предлагают использовать «addPart» с «Headers.of». – Jsm

+0

Что делает функция getFile()? Дано ли это для пути изображения? –

6

Я только что изменил addFormDataPart вместо addPart и наконец решить мою проблему, используя следующий код:

/** 
    * Upload Image 
    * 
    * @param memberId 
    * @param sourceImageFile 
    * @return 
    */ 
    public static JSONObject uploadImage(String memberId, String sourceImageFile) { 

     try { 
      File sourceFile = new File(sourceImageFile); 

      Log.d(TAG, "File...::::" + sourceFile + " : " + sourceFile.exists()); 

      final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png"); 

      RequestBody requestBody = new MultipartBuilder() 
        .type(MultipartBuilder.FORM) 
        .addFormDataPart("member_id", memberId) 
        .addFormDataPart("file", "profile.png", RequestBody.create(MEDIA_TYPE_PNG, sourceFile)) 
        .build(); 

      Request request = new Request.Builder() 
        .url(URL_UPLOAD_IMAGE) 
        .post(requestBody) 
        .build(); 

      OkHttpClient client = new OkHttpClient(); 
      Response response = client.newCall(request).execute(); 
      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; 
    } 
+0

вы можете указать код на стороне сервера, если вы используете php ?? – Rookie

+0

Что такое MultipartBuilder. shubhank сказал, что это часть okHttp, но когда я беру его в свой проект, он не решается и дает мне ошибку – Jumong

1

в OKHTTP 3+ использования этого AsyncTask

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

     } 
    } 
Смежные вопросы