PDA

Просмотр полной версии : Искажение изображений при POST multipart/form-data


FindeR
01.06.2010, 20:09
Писал пост в "вопросы по PHP", но вопрос быстро затерялся, так и не ответили. Сам в итоге так и не разобрался, поэтому создаю тему.

Помогите разобраться.
Была проблема с загрузкой постом файлов на сервак.
Накидал вот такой скрипт для теста (кинул в папку с правами 777).


<?php
if (empty($_FILES["img_file"]["name"])) {
?>
<form action="index.php" method="POST" enctype="multipart/form-data">
img: <input type="file" name="img_file" />
<input type="submit" value="Загрузить" />
</form>
<?php
}
else {

$imageinfo = getimagesize($_FILES['img_file']['tmp_name']);
if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg' && $imageinfo['mime'] != 'image/png')
{
echo '<span style="font-size:13px;">Ошибка загрузки изображения.</span>';
}

else
{
move_uploaded_file($_FILES["img_file"]["tmp_name"], $_FILES["img_file"]["name"]);

echo '<img src="'.$_FILES["img_file"]["name"].'" />';
}
}
?>


На денвере всё замечательно. Загружаются jpg,gif,png.

А вот при заливке на хостинг начинаются проблемы.

1) При попытке загрузки jpg/jpeg вываливает "Ошибка загрузки изображения". Причём, $_FILES['img_file']['tmp_name'] не пуст! А вот getimagesize от него уже не берётся - пусто. Правда, догадываюсь, что это связано со вторым вопросом :)

2) При загрузке оставшихся png и gif он их загружает, отрабатывается move_uploaded_file (файл появляется в папке), но вот потом нифига не отображается. В мозиллке отображается иконка повреждённого файла, в IE крестик...Если слить с сервера файл - не открывается уже. Откуда берётся эта "обработка" файла?

SHiNiGaMi
01.06.2010, 20:32
Я же тебе ответил как я решил проблему... Я короче все в GIF переделывал и не парился.

Накрайняк попробуй открыть как бинарник и в каждой строке \r\n заменить на \n. Бред, но попробовать чисто ради интереса надо

FindeR
01.06.2010, 21:02
SHiNiGaMi, cорри, забыл там ответить.

Если ты имеешь в виду переделывать программно, скриптом - то не катит, т.к. он не воспринимает jpg, как картинку, в принципе.
Это одна из причин. Вторая - 256 цветов ну никак не хватает :)

Ну и третья - gif'ы тоже не загружаются нормально. Я ж говорю, gif и png "портятся", jpg вообще не воспринимаются...

Сравнил файлы сейчас.
При заливке на сервак символы http://s57.radikal.ru/i155/1006/3d/c6e68120ae4e.jpg заменены на пробелы. Как это лечить?

upd: символ 00 заменяется везде на 20
Как вернуть 00 на родину?..

Chaak
01.06.2010, 21:29
с 00 ты уверен :D?

FindeR
01.06.2010, 21:32
Открыл hex-редактором, посмотрел оба файла. Отличаются только этим. Вместо 00 (NUL) везде 20 (пробел)

GreenBear
01.06.2010, 21:42
хм. а как ты заливаешь файлы? в принципе у curl никогда не было проблем с заливкой файлов и никаких особых знаний и мозгоебателсьтв, которые есть в fsockopen, там нету.

FindeR
01.06.2010, 21:46
GreenBear, в первом посте весь скрипт..

Сначала постом с enctype="multipart/form-data" файл падает на сервак, в tmp.

Потом через move_uploaded_file() кладу его, куда мне нужно. Судя по тому, что неправильно берётся getimagesize, проблема при загрузке постом.

Есть уже готовый проект, который работает отлично на masterhost'e, сейчас вот залил на хостинг от nic.ru - такая байда.

GreenBear
01.06.2010, 21:54
стало быть проблема в хостинге.

FindeR
01.06.2010, 22:01
Так увлёкся поиском косяков в своём проекте, что забыл о настройках хостинга.
Выключил charset_module, всё стало на свои места :)
Всем спасибо, тему можно прикрыть.