Отправка файла Android Retrofit

150
01 ноября 2018, 03:50

Пытаюсь научиться отправлять картинку (и рядом еще json) на сервер но никак не получаеться. Вот код интерфейса:

@Multipart
@POST("index.php")
Call<ResponseModel> uploadImage(@Part("json_field") String description, @Part("image") RequestBody image);

Вот код как я создаю намерение для получения фото:

if (Build.VERSION.SDK_INT <=19){
     Intent intent = new Intent();
     intent.setType("image/jpeg");
     intent.setAction(Intent.ACTION_GET_CONTENT);
     startActivityForResult(Intent.createChooser(intent, "Выбор изоброжения"),100);
} else {
     Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
     intent.addCategory(Intent.CATEGORY_OPENABLE);
     intent.setType("image/*");
     startActivityForResult(intent, 100);
}

Ошибку выводить на всех версиях sdk. Вот код получения изоброжения:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 100 && resultCode == RESULT_OK){
        Uri imageUri = data.getData();
        File file = new File(String.valueOf(imageUri));

        RequestBody requestFile = RequestBody.create(imageType, file);
        uploadData(requestFile);
    }
}

ну и естественно текст ошибки:

/content:/media/external/images/media/31037: open failed: ENOENT (No such file or directory)
Answer 1

Проблема в этой строчке. У вас неправильно считывается Uri

File file = new File(String.valueOf(imageUri));

Попробуйте`

File file = new File(getPath(imageUri));

Метод getPath()

public String getPath(Uri uri) {
   String[] projection = { MediaStore.Images.Media.DATA };
   Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
   cursor.moveToFirst();                
   int columnIndex = cursor.getColumnIndex(projection[0]);
   String filePath = cursor.getString(columnIndex);
   cursor.close();        
   return filePath;
}

И поменяйте интент, если будет выдавать NullPointerException на такой

Intent i = new Intent(Intent.ACTION_PICK,
                 android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
READ ALSO
Оптимизация кода работы с Таблицей Гугл

Оптимизация кода работы с Таблицей Гугл

Имеются 10 листов, в которых происходит то самое действие

133
Ошибка 400 при использовании Ajax в Safari

Ошибка 400 при использовании Ajax в Safari

У меня есть JS код, где написан Ajax-запрос к серверу:

164
Передача значений из checkbox в функцию

Передача значений из checkbox в функцию

уважаемые коллегиЯ только недавно начал осваивать js и jquery, и в процессе написания одного скрипта для расчётчика возникла проблема

157
аутентификация с Passport.js

аутентификация с Passport.js

Помогите пожалуйста, понят что я делаю не такВсё время получаю 'Login failed'

152