Страница 1 из 1

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

Добавлено: 02 мар 2015, 21:22
geoboo
Стоит задача: из приложения отправлять на сервер изображения. Все сделано "по науке", на сервере возникает ошибка:
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);
Народ! Выручай!
Что не так? или готовый код как отправить с клиента и принять на сервере?

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

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

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

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

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

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

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

Добавлено: 03 мар 2015, 14:14
geoboo
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 отказываются работать с результатами друг-друга, но этого не может быть!

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

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

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

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