Загрузка файлов PHP приводит к поврежденным файлам на сервере Windows Apache
Я написал скрипт загрузки файла для PHP. Я тестирую на сервере Windows Apache, но в конечном итоге он должен будет работать на сервере CentOS с Apache. Поскольку я все еще отлаживаю, я не проверял это на живой машине Linux. Погуглите, но не можете найти хорошее решение.
Что просходит? Когда я загружаю файл.png или.jp(e)g, все идет хорошо. Скрипт перемещает мой файл в нужную папку, но затем выводит нечитаемый файл. Проверьте изображение ниже. Моя загружаемая часть скрипта:
if ($posting_photo === true) {
$uploaded_file = $_FILES['review_photo'];
$uploaded_file['ext'] = explode('.', $uploaded_file['name']);
//Only continue if a file was uploaded with a name and an extension
if ((!empty($uploaded_file['name'])) && (is_array($uploaded_file['ext']))) {
$uploaded_file['ext'] = secure(strtolower(end($uploaded_file['ext'])));
$upload_session = secure($_COOKIE[COOKIE_NAME_POST_REVIEW_SESSION]);
$upload_dir = realpath(getcwd() . DIR_REVIEW_IMAGES) . DIRECTORY_SEPARATOR . $upload_session . DIRECTORY_SEPARATOR;
$upload_ext = array('jpg', 'jpeg', 'png');
//Only continue if a file was uploaded in a right way
if (($uploaded_file['error'] == 0) && ($uploaded_file['size'] > 0) && ($uploaded_file['size'] <= MAX_FILESIZE_REVIEW_PHOTO_BYTES) && (in_array($uploaded_file['ext'], $upload_ext))) {
//Check if upload dir already exists. If so, there will be probably files in it. So we check for that too. If not, we can start with the first file.
if (is_dir($upload_dir)) {
//
//
//Part where a new file name gets generated. Not very interesting and it works well, so I left it out on Stack Overflow
//
//
} else {
mkdir($upload_dir, 0777, true);
$upload_name = $upload_session . '-1.' . $uploaded_file['ext'];
}
//Check if new upload name was generated. If not, something is wrong and we will not continue
if (!empty($upload_name)) {
chmod($upload_dir, 0777);
if (move_uploaded_file($uploaded_file['tmp_name'], $upload_dir . $upload_name)) {
$files = array_diff(@scandir($upload_dir), array('.', '..'));
//Change slashes on Windows machines for showing the image later
$upload_dir = str_replace('\\', '/', $upload_dir);
}
}
}
}
}
Все переменные, не инициализированные здесь, инициализируются ранее. Файл cookie устанавливается и проверяется ранее и используется для уникальных имен каталогов и файлов. Проверьте это изображение для выходного файла. Буква x слева от Dropbox (Dropbox говорит: не удается синхронизировать... доступ запрещен). В окне просмотра фотографий появится сообщение: "Невозможно открыть это изображение, так как у вас нет доступа к местоположению файла. Просмотр файла в браузере приводит к отказу в разрешении. Ссылка на изображение
Кто знаком с этой проблемой и / или знает решение? Надеюсь, вы можете помочь мне здесь!
2 ответа
Было это когда-то тоже. Это ошибка в PHP 5.3.x. После обновления с 5.3.3 до 5.6 проблемы пропали!
Хорошо, вот обновление о проблеме... Описанная выше проблема была вызвана моим локальным сервером в моем офисе. На моем локальном сервере дома изображения были в порядке после перемещения. Так что это не мой сценарий, а сервер. Я думаю, PHP обрабатывает что-то другое.
Версия PHP в моем офисе - версия 5.4.9, PHP дома - версия 5.3.3. Может быть, эта информация может помочь?