загрузка файла с нулевым ответом okhttp3

#php #android #okhttp3

#php #Android #okhttp3

Вопрос:

Привет, я пытаюсь загрузить файл jpg с помощью составного запроса okhttp3 на php-сервер. Скрипт проверяет наличие $_FILES[«image1»] и корректно работает из HTML-формы. При использовании приведенного ниже кода я получаю нулевой ответ от сервера.

Если я удалю последний addFormDataPart, содержащий часть загрузки файла, я получу ответ от сервера, что image1 не установлен.

Редактировать * я обнаружил, что логическое значение b = files.get(0).isFile(); возвращает false для файлов, хранящихся на моем мобильном устройстве, и true для файлов, хранящихся в dropbox. Файлы Dropbox возвращают правильный файл ответа на телефоне, по-прежнему возвращая нулевой http-ответ. Есть предложения?

 public AsyncHttpPost(String id, String password, List<File> files, OnTaskComplete listener ) {
    MediaType MEDIA_TYPE_JPG = MediaType.parse("image/jpg");
    MultipartBody.Builder  builder = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart(ResponseDTO.TAG_ID, String.valueOf(id))
            .addFormDataPart(ResponseDTO.TAG_PASSWORD, password)
            .addFormDataPart("image1", "Test.jpg", RequestBody.create(MEDIA_TYPE_JPG, files.get(0)));

    mRequestBody = builder.build();
    mListener = listener;
}

public AsyncHttpPost() {
}

public void setListener(OnTaskComplete listener){
    mListener = listener;
}

@Override
protected String doInBackground(String... params) {
    String result = "";

    OkHttpClient client = new OkHttpClient();

    Request request = new Request.Builder()
            .url(params[0])
            .post(mRequestBody)
            .build();



    Response response  = null;
    try {
        response = client.newCall(request).execute();
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        if(response != null) {
            result = response.body().string();
        }else{
            result = "null";
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return resu<
}
 

Ответ №1:

при использовании пути URI isFile() возвращает false. Поэтому мне пришлось создать файл, используя путь, как показано ниже. Затем это приводит к нулевому ответу через несколько секунд, поэтому я также обновил значения таймаута для своего http-клиента

 File f = new File(uri.getPath()); //didnt work
File f = new File("/storage/emulated/0/DCIM/Camera/Test.jpg");

    OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(10, TimeUnit.SECONDS)
            .writeTimeout(300, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS)
            .build();