PHP сервер: сохранить (загрузить) изображение с Android с помощью Retrofit

Прежде всего, спасибо за чтение моего вопроса.

У меня есть сервер PHP, куда я хотел загрузить изображение с устройств Android.
Когда я выбираю изображение в своем телефоне, оно загружается как TypedFile (retrofit.mime.TypedFile) в скрипт PHP.
Когда я хочу увидеть изображение с помощью веб-браузера или загрузить изображение с помощью FTP-клиента, изображение повреждено.
Журнал показывает мне байты изображения, и загруженный файл содержит эти байты.
Первая строка байтов изображения:

RIFF  WEBPVP8 „  ¥ *,>Ñ`©P(%$##‘Œ9  i;\·û~œdàþ  ÚKfëp‡ö~

(Тип MIMP WebP?)

Мой PHP-скрипт выглядит так:

    [...]
$pic = 'uploaded_images/' . $imagename . '.jpg';
if (!move_uploaded_file($_FILES['image']['tmp_name'], $pic)) {
echo "ko";die;
}
[...]

Я также пробовал fread, fwrite, … и это:

    $file = file_get_contents($_FILES['image']['tmp_name']);
if (!$file) {echo 'file ko';die;}
//$file = unpack('h',$file);
if (!file_put_contents($pic, $file)) {echo 'ko';die;}

И некоторые другие комбинации.

Мой запрос Android (от Intent.ACTION_PICK или Intent.ACTION_IMAGE_CAPTURE):

@Override
public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);

switch (requestCode) {
case SELECT_PHOTO:
if (resultCode == Activity.RESULT_OK) {

final boolean isCamera;
if (imageReturnedIntent == null) {
isCamera = true;
} else {
final String action = imageReturnedIntent.getAction();
if (action == null) {
isCamera = false;
} else {
isCamera = action.equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
}
}

Uri selectedImageUri;
if (isCamera) {
selectedImageUri = outputFileUri;
} else {
selectedImageUri = imageReturnedIntent == null ? null : imageReturnedIntent.getData();
}

if (selectedImageUri != null) {
String selectedImagePath = null;
Cursor cursor = getActivity().getContentResolver().query(selectedImageUri, null, null, null, null);
if (cursor == null) {
selectedImagePath = selectedImageUri.getPath();
} else {
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
selectedImagePath = cursor.getString(idx);
}

File photo = new File(selectedImagePath);
TypedFile typedImage = new TypedFile("image/*", photo);

// ProgressDialog lazy initialization
if (progress == null) {
progress = new ProgressDialog(getActivity());
progress.setTitle(getString(R.string.updating_data));
progress.setMessage(getString(R.string.please_wait));
progress.setCancelable(false);
progress.setIndeterminate(true);
}
progress.show();
Server.postUserImage(typedImage, imageCallback);
}
}
}
}

Server.postUserImage — это метод, в котором я настраиваю запрос.
Интерфейс запроса на модификацию:

@Multipart
@POST("/user/image")
void postUserImage(@Part("image") TypedFile image, Callback<User> callback);

Я очень ценю вашу помощь. Я потратил несколько часов на поиски причины и решения для этого.
Большое спасибо.

0

Решение

Я решил это.
Если у кого-то есть такая же проблема:

Ошибка была MIME-тип отправленного файла: «image / *». По некоторым причинам мой PHP-код не может сохранить некоторые изображения.
Я изменил его на «application / octet-stream», и он работает как шарм!

Это старый код:

File photo = new File(selectedImagePath);
TypedFile typedImage = new TypedFile("image/*", photo);

И это новый код:

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

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

Других решений пока нет …

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