Отправка изображения на сервер

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
geoboo
Сообщения: 4
Зарегистрирован: 01 мар 2015, 21:20

Отправка изображения на сервер

Сообщение geoboo » 02 мар 2015, 21:22

Стоит задача: из приложения отправлять на сервер изображения. Все сделано "по науке", на сервере возникает ошибка:
Warning: imagecreatefromstring() [function.imagecreatefromstring]: gd-jpeg: JPEG library reports unrecoverable error: in
Реализация в андроид клиенте:

Код: Выделить всё

String query ="";
Bitmap bitmap;
//тут картинку подгружаю из галереи
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] imageBytes = baos.toByteArray();
String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);
query=query+"&img="+encodedImage;
//далее POSTом отправляю скрипту
На сервере скрипт принимает так:

Код: Выделить всё

$_img		= $_POST['img'];
if($_img)
{
  $imageData = base64_decode($_img);
  file_put_contents ('test2.txt',$imageData);
  $photo = imagecreatefromstring($imageData); // *тут возникает ошибка !!!!
  imagejpeg($photo,'my.jpg',100); 
}
* Ошибка в указанной строке: Warning: imagecreatefromstring() [function.imagecreatefromstring]: gd-jpeg: JPEG library reports unrecoverable error: in

Итак ругается, что не может из полученных данных собрать изображение.
В ходе исследований выяснил следующее:
1)Данные, которые отправляет клиент в encodedImage в полном объеме прилетают в $_img, без искажений.
2)Если изображение подвергнуть подобной обработке на сервере imagecreatefromstring прекрасно справляется со своей задачей. Изображение собирает назад без ошибок. Т.е. на сервере все в порядке.
3)неприятное, но вполне объяснимое наблюдение, если на сервере картинку преобразовать в строку(как в клиенте) то длина результата в два раза меньше.
Длина $data в два раза меньше чем encodedImage(он же $_img)

Код: Выделить всё

$imagedata = file_get_contents("cover.jpg");
$data = base64_encode($imagedata);
Народ! Выручай!
Что не так? или готовый код как отправить с клиента и принять на сервере?

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Отправка изображения на сервер

Сообщение Mikhail_dev » 03 мар 2015, 00:37

Я не понял, данные всё таки приезжают корректные? Если да. то вам на PHP форум надо. Если данные всё же некорректные. то постарайтесь очистить Base64 строку от \r \n символов
http://stackoverflow.com/a/2163056

geoboo
Сообщения: 4
Зарегистрирован: 01 мар 2015, 21:20

Re: Отправка изображения на сервер

Сообщение geoboo » 03 мар 2015, 09:38

Mikhail_dev писал(а):Я не понял, данные всё таки приезжают корректные? Если да. то вам на PHP форум надо. Если данные всё же некорректные. то постарайтесь очистить Base64 строку от \r \n символов
http://stackoverflow.com/a/2163056
В примечании в п1, написал, что данные прилетают целые, без изменений! Но замечаний к PHP тоже нет. Потому как если процедуру провернуть полностью на нем, то все работает корректно.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Отправка изображения на сервер

Сообщение Mikhail_dev » 03 мар 2015, 10:52

Я этой же функцией пользовался и у меня были проблемы, что он вставлял символы переноса строки.
И всё же
1)Данные, которые отправляет клиент в encodedImage в полном объеме прилетают в $_img, без искажений.
Данные пришли без изменений. Значит клиент выполнил свою задачу
2)Если изображение подвергнуть подобной обработке на сервере imagecreatefromstring прекрасно справляется со своей задачей. Изображение собирает назад без ошибок. Т.е. на сервере все в порядке.
Сервер корректно работает. Так что же вам тогда надобно???

geoboo
Сообщения: 4
Зарегистрирован: 01 мар 2015, 21:20

Re: Отправка изображения на сервер

Сообщение geoboo » 03 мар 2015, 14:14

Mikhail_dev писал(а):Я этой же функцией пользовался и у меня были проблемы, что он вставлял символы переноса строки.
И всё же
1)Данные, которые отправляет клиент в encodedImage в полном объеме прилетают в $_img, без искажений.
Данные пришли без изменений. Значит клиент выполнил свою задачу
Так мы запутаемся. Получается что клиент кодирует изображение в стоку, которую на сервере php не в состоянии назад собрать в изображение. Я тупике.
1)Проверил - Перевода строк у меня нет.
2)Проверил на клиенте. Если Изображение кодировать в строку и потом назад - все работает:
Код примерно такой:

Код: Выделить всё

    	            
ByteArrayOutputStream baos = new ByteArrayOutputStream();
scaled.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] imageBytes = baos.toByteArray();
String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT); //кодирую в строку которую потом отправляю на сервер.
byte[] byteArray = Base64.decode(encodedImage, Base64.DEFAULT); //тут же раскодирую и 
Bitmap scaled2= BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length); //преобразую в изображение
ImageView.setImageBitmap(scaled2);
toastContainer.addView(ImageView, 0);
toast.show(); //на экране требуемая картинка
Подобная двойная конвертация выполняется и на сервере без проблем.
Когда передаю encodedImage на сервер, там из этих данных картинка не получается.
Функции работы с изображениями в андроиде и php отказываются работать с результатами друг-друга, но этого не может быть!

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Отправка изображения на сервер

Сообщение Mikhail_dev » 03 мар 2015, 19:18

Возьмите результат строки что приходит в php и проверьте её в онлайн конверторах. Вроде еще хром умеет это делать, если вставить её в строку адреса, он сразу конвертит в изображение. Если всё пройдёт гладко, то тогда проблема в php.

geoboo
Сообщения: 4
Зарегистрирован: 01 мар 2015, 21:20

Re: Отправка изображения на сервер

Сообщение geoboo » 04 мар 2015, 19:51

Mikhail_dev писал(а):Возьмите результат строки что приходит в php и проверьте её в онлайн конверторах. Вроде еще хром умеет это делать, если вставить её в строку адреса, он сразу конвертит в изображение. Если всё пройдёт гладко, то тогда проблема в php.
Спасибо. Действительно строка прилетала с " " вместо "+", все остальное было в норме.

Ответить