Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: загрузка файла. Загруженный файл нечитается
 
 автор: prosot   (01.08.2012 в 19:01)   письмо автору
 
 

$papka = './files/'; // путь для сохранения файлов
$VremenImya = $_FILES['user_file']['tmp_name']; // путь и имя временного файла
$type=$_FILES['user_file']['type']; // тип переданного файла
$nacheImy=$_FILES['user_file']['name']; // имя постоянного файла
$size=$LILES['user_file']['size'];
// теперь переместим файл из временного в наш каталог и запишем его
move_uploaded_file($VremenImya,$nacheImy);

полученый файл получается поврежденным.
Помогите пожалуста разобраться в чем тут дело.

  Ответить  
 
 автор: confirm   (01.08.2012 в 19:03)   письмо автору
 
   для: prosot   (01.08.2012 в 19:01)
 

А вы перед тем как перемещать файл, проверьте наличие ошибок - $_FILES['user_file']['error']

  Ответить  
 
 автор: prosot   (01.08.2012 в 19:12)   письмо автору
 
   для: confirm   (01.08.2012 в 19:03)
 

сейчас проверю. но ситуация вот в чем . файл графический .gif его переношу из winXP на хост с линоксом, может в этом проблема. При этом и размер и тип у полученного файла совпадают

  Ответить  
 
 автор: confirm   (01.08.2012 в 19:28)   письмо автору
 
   для: prosot   (01.08.2012 в 19:12)
 

Да какая разница с какой платформы на какую вы закачиваете файл. Это бинарные данные.
На тип, который вам передал клиент в форме не надейтесь (это на будущее).
Если нет ошибок при загрузке, размер загружаемых POST данных и размер файла не превышают указанные в настройках, то - либо вы что-то не так делаете, либо действительно сервер бьет данные.
А как при это происходит загрузка текста из полей формы, и загрузка текстового файла?

  Ответить  
 
 автор: prosot   (01.08.2012 в 19:31)   письмо автору
 
   для: confirm   (01.08.2012 в 19:28)
 

текст и текстовые файлы передаются нормально

  Ответить  
 
 автор: prosot   (01.08.2012 в 19:36)   письмо автору
 
   для: prosot   (01.08.2012 в 19:31)
 

вот взял код с сайта - конечный результат тот-же. скопированный файл неоткрыватся

$path_to_files = './files/'; // путь для сохранения файлов
// если у нас несколько полей userfile[],
// отметаем те, в которые ничего не было выбрано
$good_name = array_filter($_FILES['userfile']['name']);
if (sizeof($good_name) != 0) { // если массив файлов не пустой
foreach ($good_name as $key => $name) {
$type = $_FILES['userfile']['type'][$key];
$tmp_name = $_FILES['userfile']['tmp_name'][$key];
$size = $_FILES['userfile']['size'][$key];
// эта функция проверяет был ли загружен файл во временную директорию php
if (!is_uploaded_file($tmp_name)) {
echo "An error happened while loading. Failed.";
continue;
}
// выковыриваем имя и расширение файла -
$file_ext = substr($name, 1 + strrpos($name, "."));
// - это может понадобиться, например, для сохранения в базу данных
$file_name = substr($name, 0, strrpos($name, "."));
// делаем реальный путь в файловой системе
$real_path = realpath($path_to_files);
// создаем в нашей директории временный файл с уникальным именем,
// это делается для того, чтобы избежать одновременного
// закачивания файлов с одним именем
$temp_file_name = tempnam($real_path, "UPLF");
// делаем новое, более привлекательное, имя файла для хранения на сервере
$file_name = $temp_file_name."original.".strtolower($file_ext);
// переносим загруженный временный файл в файл со
// сделанным нами уникальным именем
if (move_uploaded_file($tmp_name, $file_name)) {
echo "Saved!";
unlink($temp_file_name); // удаляем временный файл
}else {
echo "Failed!";
continue;
}
}
}else {
echo "No files were loaded.";
}

  Ответить  
 
 автор: confirm   (01.08.2012 в 19:58)   письмо автору
 
   для: prosot   (01.08.2012 в 19:36)
 

При помещении кода в форму, обрамляйте его тегами [сode][/сode], и в начале своего кода помещайте php-тег - <?, чтобы код имел подсветку, иначе такое читать, и разбираться в нем не охота.

А код вообще ужас, думаю вас это не удивит. Выполните этот код написанный по вашей "технологии":
<?
echo '<pre>';
if(
$_FILES) {
   
$good_name array_filter($_FILES['userfile']['name']);
   
print_r($good_name); 
   foreach (
$good_name as $key => $name) echo $_FILES['userfile']['name'][$key].'<br>';  
}
?>
<form method="post" enctype="multipart/form-data">
<input type="file" name="userfile[]" />
<input type="file" name="userfile[]" />
<input type="file" name="userfile[]" />
<input type="submit" value="Send" />
</form>
Что наблюдаете?

PS. Не буду дожидаться ответа. А теперь в цикле выводите так:
<?
foreach ($good_name as $key => $name) echo $name.'<br>';

Спрашивается - зачем нужен этот цикл? Ради индекса чтобы обратиться к другим ключам массива? Зачем тогда так необдуманно применили array_filter()?

  Ответить  
 
 автор: prosot   (02.08.2012 в 12:56)   письмо автору
 
   для: confirm   (01.08.2012 в 19:58)
 

Большое спасибо. Решение вопроса нашлось :

В корне сайта создал файл .htaccess:
в нем прописал две строки

CharsetDisable on
CharsetRecodeMultipartForms Off

теперь файлы загружаются/отображаются корректно. ( это подсказали на хостинге).

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

Еще раз большое спасибо , я новичок , поэтому много незнаю.

  Ответить  
 
 автор: confirm   (02.08.2012 в 13:11)   письмо автору
 
   для: prosot   (02.08.2012 в 12:56)
 

array_filter() обходит массив рекурсивно. У вас эта функция ничего полезного не делает, тем более, что в последствие вы обходите массив циклом, а фильтруете вы совсем не то, что следовало бы.
Можно вычесть пустое из массива, но не array_filter(), а другими функциями, но это полезно тогда, когда, например, нужно получить набор, который нужно как либо представить, или который будет служить для сравнения.
В вашем коде все это лишнее, и не только указанная функция, но и realpath(), и т.д.
Получая массив загруженных файлов, проверяйте его сразу в цикле, причем проверять надо не "пустое ли имя файла", а ключ "error" - если нет ошибок в этом ключе, значит файл загружен и можно производить с ним действия. Ключ будет содержать имя даже в том случае, если файл закачан с ошибкой - не полностью!
Доверяться на "чик по точке перед расширением, и все окейно", это по меньшей мере собирать у себя на сервере мусор вместо изображений, так как я сохраню анекдот любой под расширением gif, и вы его своей загрузкой "скушаете".
Ну и все остальное у вас тоже... Лучше поищите в сети готовые примеры загрузки файлов на сервер, разберите их, проанализируйте, а то, что вы тут выставили выбросите в помойку.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования