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

0

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

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

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

(Тип мультиметра 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);

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

Теги:
image
retrofit
webp

1 ответ

0

Я решил это. В случае, если кто-то имеет такую же проблему:

Ошибка была типом mime файла sended: "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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню