Отправка файла изображения с помощью Retrofit?

Я тестирую способ отправки изображения с использованием библиотеки Retrofit. В документации Retrofit здесь: http://square.github.io/retrofit/ есть способ использовать аннотацию @MultiPart.
Я пытаюсь использовать как документацию, но все еще не работает для меня.

Как мне это сделать ?

Вот как я пытаюсь.

PHP-файл веб-службы

if($_REQUEST["uploadfile"] == "add"){
$uploaddir = 'C:\Users\fernando\Pictures';
$uploadfile = $uploaddir . $_FILES['userfile']['name'];

$response = array();
//param
$response["nome"] = $_REQUEST["nome"];if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir . $_FILES['userfile']['name'])) {
$response["msg"] = "O arquivo é valido e foi carregado com sucesso. Aqui esta alguma informação:\n";
print_r($_FILES);
}  else {
$response["msg"] = "Possivel ataque de upload! Aqui esta alguma informação:\n";
print_r($_FILES);
}
$json = json_encode($response);
echo $json;
}

Слушатель Усуарио

public interface UsuarioListener {

//send an image with params with Post
@Multipart
@POST("/android/login.php")
void setUserImage(
@QueryMap Map<String, String> params,
@Part("pathImage") TypedFile file,
Callback<JsonElement> response);

}

Деятельность

btnEnviar.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
setUserImage();
}
});
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (requestCode == RESULT_LOAD_IMAGE &&
resultCode == RESULT_OK &&
null != data) {
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };

Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
cursor.moveToFirst();

int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
pathImage = cursor.getString(columnIndex);
cursor.close();
}
}

public void setUserImage() {
HashMap<String, String> params = new HashMap<String, String>();
params.put("nome", "Fernando Paiva Campos");

RestAdapter adapter = new RestAdapter.Builder()
.setLogLevel(RestAdapter.LogLevel.FULL)
.setEndpoint(END_POINT).build();
UsuarioListener listener = adapter.create(UsuarioListener.class);

TypedFile image = new TypedFile("image/jpg", new File(pathImage));
listener.setUserImage(
params,
image,
new Callback<JsonElement>() {
@Override
public void success(JsonElement arg0, Response arg1) {
Log.i("JSON_ELEMENT:", arg0.toString() + "");
}

@Override
public void failure(RetrofitError arg0) {
Log.e("ERROR:", arg0.getLocalizedMessage());

}
});
}

исключение

E / ERROR: (5200): com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: используйте JsonReader.setLenient (true) для принятия искаженного JSON в строке 1 столбца 6.

3

Решение

Похоже, ошибка, указанная выше, связана с вашим выводом php. Неясно, была ли загрузка успешной или нет, но ваш ответ является недопустимым JSON, потому что перед тем, как повторить ответ JSON, вы также выводите значение $_FILES, Попробуйте закомментировать строки с помощью следующего кода в вашем php-файле.

print_r($_FILES);
1

Другие решения

В ваших задачах есть два исправления:

В вашем коде это:

public interface UsuarioListener {

//send an image with params with Post
@Multipart
@POST("/android/login.php")
void setUserImage(
@QueryMap Map<String, String> params,
// the @Part has the parameter "pathImage".
// You should pass this in your php code.
@Part("pathImage") TypedFile file,
Callback<JsonElement> response);
}

Так что ваш PHP-код должен выглядеть так:

if($_REQUEST["uploadfile"] == "add"){
$uploaddir = 'C:\Users\fernando\Pictures';
$uploadfile = $uploaddir . $_FILES['userfile']['name'];

$response = array();
//param
$response["nome"] = $_REQUEST["nome"];

if (move_uploaded_file($_FILES['pathImage']['tmp_name'], $uploaddir . $_FILES['pathImage']['name']))

Окончательное исправление в вашем клиенте Retrofit:

TypedFile typedImage = new TypedFile("application/octet-stream", photo);

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

0

По вопросам рекламы [email protected]