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