[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема с загрузкой файла
Svetlaya
Здравствуйте. В рамках создания цмс добавления новостей сайт возникла новая проблема. Вроде все работало и не предвещало беды, но вот что произошло.
Есть функция загрузки файла, в данном случае изображения.

  function upload($_FILES,$url,$maxsize = 1024){
@mkdir("img", 777);
if($_FILES['IMG']['name'] !=''){
//Проверяем размер файла
if($_FILES['IMG']['size'] != 0 AND $_FILES['IMG']['size']<=($maxsize*1024)) {
//Проверяем расширение файла

$ext=array(".gif", ".jpeg", ".jpg");
if(in_array(strrchr($_FILES['IMG']['name'],"."),$ext)){
//Проверяем загрузился ли файл на сервер
if(is_uploaded_file($_FILES['IMG']['tmp_name'])) {
//Перемещаем загруженный файл в необходимую папку $url
if(move_uploaded_file($_FILES['IMG']['tmp_name'], $url."/".md5(basename($_FILES['IMG']['name'])))) {
return TRUE;

} else { return FALSE;}
}
else { return FALSE;}
}
else { return FALSE;}
}
else { return FALSE;}

}
}



Но было замечено, что некоторые изображения получают фнкцией md5 одинаковый код, оттого в папку с изображениями не перемещаются, то есть в базе данных фигурируют, а в папке их нет. А одна статья вообще в базу данных не записывает никакого url. Отчего так может быть? Помогите пожалуйста или советом мудрым или скрипты мои кто не сочтет за труд посмотреть. Я в панике.



Спустя 10 минут, 23 секунды (16.01.2011 - 12:17) Snus написал(а):
Svetlaya
Делай названия файлов в microtime().jpg(gif, png) smile.gif

Спустя 2 минуты, 17 секунд (16.01.2011 - 12:19) Svetlaya написал(а):
А что и зачем это? Обьясните мне глупой. huh.gif

Спустя 12 минут, 21 секунда (16.01.2011 - 12:31) Snus написал(а):
Svetlaya
База данных должна быть примерно следующей структуры:

id | fileName | fileType | filePath | upDate

Где filePath - название файла (лучше даже полный путь к твоему файлу),

название это генерировать еще лучше так:

$fileDir = 'files/';

$ext = substr($_FILES['IMG']['name'], -3);
$filePath = $fileDir.microtime().'_'.rand(1,99).'.'.$ext;


и пишешь в базу $filePath, потом достаешь нужную запись в бд и генерируешь html-год:

$query = "SELECT `fileName`, `filePath` FROM `files` WHERE `id` = '1'";
$sql = mysql_query($query) or die(mysql_error());
list($fileName, $filePath) = mysql_fetch_array($sql);

echo '<h2>'.$fileName.'</h2>';
echo '<img src="'.$filePath.'" title="'.$fileName.'">';

Спустя 11 минут, 8 секунд (16.01.2011 - 12:42) Svetlaya написал(а):
Мне в принципе имя файла не нужно, ибо изображение просто иллюстрирует текст.
А структура таблицы у меня аналогичная с вашим примером. То есть в каждой строке все данные по статье. И из базы вот как достается изображение.

$Q2 = mysql_query("SELECT * FROM tnews WHERE id={$_REQUEST['id']}");
$r = mysql_fetch_array($Q2);
if($r['img_url']!==''){
?>

   <div class="news_box">
<div
id="bg-heading"><span class="heading"><?=stripslashes($r['heading']);?></span>
<span
class="date"><?=substr($r['date_up'],8,2);?>.<?=substr($r['date_up'],5,2);?>.<?=substr($r['date_up'],0,4);?></span></div>
<div
class="title"><?=stripslashes($r['title']);?></div>
<div
class="subtitle"><?=stripslashes($r['subtitle']);?></div>
<img
class="img_news" src="<?=$url;?>/<?=$r['img_url'];?>" /><div class="text"><?=nl2br(stripslashes($r['news']));?>
</div>
<div
class="author_news"><?=stripslashes($r['author']);?></div><br />
<span
class="full_views">Просмотров <?=$r['views'];?></span>

</div>


Мне интересно отчего одни записываются по человечески картинки, а другие блажат. Ведь должна же быть какая-то определенная причина.

Спустя 3 минуты, 56 секунд (16.01.2011 - 12:46) Snus написал(а):
Svetlaya
А у Вас запись в БД после проверки на запись файла или до?

Спустя 5 минут, 15 секунд (16.01.2011 - 12:51) Svetlaya написал(а):
После

//Работаем с файлом
if(upload($_FILES,$url)) {
//Обзываем файл
$img_url = md5(basename($_FILES['IMG']['name']));
//Выполняем запрос
$query = ("INSERT INTO tnews VALUES(NULL,'".$heading."','".$title."','".$subtitle."','".$text."','".$author."','".$img_url."','".$date."','".$prew."','0')");



Спустя 6 минут, 54 секунды (16.01.2011 - 12:58) Snus написал(а):
Svetlaya
Попробуй
md5(basename($_FILES['IMG']['name']))
заменить на тот вариант, что я тебе написал.

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

Спустя 11 минут, 10 секунд (16.01.2011 - 13:10) Svetlaya написал(а):
А можно конкретную строчку что на что заменить. А то я если честно не очень поняла. Но дело похоже, вы правы, в одинаковых названиях файлов.

Спустя 5 минут, 32 секунды (16.01.2011 - 13:15) Snus написал(а):
Svetlaya
$img_url = md5(basename($_FILES['IMG']['name']));

на

$fileDir = 'files/';

$ext = substr($_FILES['IMG']['name'], -3);
$filePath = $fileDir.microtime().'_'.rand(1,99).'.'.$ext;


И соответственно, тут тоже


if(move_uploaded_file($_FILES['IMG']['tmp_name'], $filePath)) {


и запишешь в БД $filePath вместо $img_url. И не забывай, что в БД уже пишется полный путь. Так что вывод на экран будет таким:

$query = "SELECT `fileName`, `filePath` FROM `files` WHERE `id` = '1'";
$sql = mysql_query($query) or die(mysql_error());
list($fileName, $filePath) = mysql_fetch_array($sql);

echo '<h2>'.$fileName.'</h2>';
echo '<img src="'.$filePath.'" title="'.$fileName.'">';


Спустя 1 час, 52 минуты, 47 секунд (16.01.2011 - 15:08) Svetlaya написал(а):
Уважаемый Snus, как будет выглядеть функция upload?

function upload($_FILES,$fileDir,$maxsize = 1024){
@mkdir("img", 0777);
if($_FILES['IMG']['name'] !=''){
//Проверяем размер файла
if($_FILES['IMG']['size'] != 0 AND $_FILES['IMG']['size']<=($maxsize*1024)) {
//Проверяем расширение файла


$ext=array(".gif", ".jpeg", ".jpg");
if(in_array(strrchr($_FILES['IMG']['name'],"."),$ext)){
$extt = substr($_FILES['IMG']['name'], -3);
$filePath = $fileDir.microtime().'_'.rand(1,99).'.'.$extt;
//Проверяем загрузился ли файл на сервер
if(is_uploaded_file($_FILES['IMG']['tmp_name'])) {
//Перемещаем загруженный файл в необходимую папку $url
if(move_uploaded_file($_FILES['IMG']['tmp_name'], $filePath)) {
return TRUE;

} else { return FALSE;}
}
else { return FALSE;}
}
else { return FALSE;}
}
else { return FALSE;}

}
}


Что тут изменить?

if($_POST['do'] =='') {


<form name="" method="POST" enctype="multipart/form-data"> 
Загрузить изображение:<br/>
<input
type="file" name="IMG" /> <br/>
<input
name="do" type="submit" value="Сохранить"/>
</form>


<?php
}
else {
if(upload($_FILES,$fileDir)) {
$ext = substr($_FILES['IMG']['name'], -3);
$filePath = $fileDir.microtime().'_'.rand(1,99).'.'.$ext;
$query = ("INSERT INTO img VALUES(NULL,'".$filePath."',)");
$q2 = @mysql_query($query);
if($q2) { echo 'Изображение добавлено'; }
}

else{echo 'Ошибка';}
}


Извините, что так пристала к вам, но уж очень хочется разобраться, а понимание все не приходит.

Спустя 7 минут, 9 секунд (16.01.2011 - 15:15) Snus написал(а):
Svetlaya

$extt = substr($_FILES['IMG']['name'], -3);
$filePath = $fileDir.microtime().'_'.rand(1,99).'.'.$extt;

Достаточно 1 раз прописать, а то Вы дважды генерируете микротайм и случайное число и названия в БД и изображения будут отличаться.

Спустя 1 минута, 46 секунд (16.01.2011 - 15:17) Svetlaya написал(а):
У меня что-то совсем в базу ничего не заносится

Спустя 43 секунды (16.01.2011 - 15:18) Snus написал(а):
function upload($_FILES,$fileDir,$maxsize = 1024){
@mkdir("img", 0777);
if($_FILES['IMG']['name'] !=''){
//Проверяем размер файла
if($_FILES['IMG']['size'] != 0 AND $_FILES['IMG']['size']<=($maxsize*1024)) {
//Проверяем расширение файла


$ext=array(".gif", ".jpeg", ".jpg");
if(in_array(strrchr($_FILES['IMG']['name'],"."),$ext)){
$extt = substr($_FILES['IMG']['name'], -3);
$filePath = $fileDir.microtime().'_'.rand(1,99).'.'.$extt;
//Проверяем загрузился ли файл на сервер
if(is_uploaded_file($_FILES['IMG']['tmp_name'])) {
//Перемещаем загруженный файл в необходимую папку $url
if(move_uploaded_file($_FILES['IMG']['tmp_name'], $filePath)) {
return $filePath;

} else { return FALSE;}
} else { return FALSE;}
} else { return FALSE;}
} else { return FALSE;}

}
}




if(($filePath = upload($_FILES,$fileDir)) !== FALSE) {
$query = ("INSERT INTO img VALUES(NULL,'".$filePath."',)");
$q2 = @mysql_query($query);
if($q2) { echo 'Изображение добавлено'; }
}
else{echo 'Ошибка';}
}

Спустя 58 секунд (16.01.2011 - 15:18) Snus написал(а):
Цитата (Svetlaya @ 16.01.2011 - 12:17)
У меня что-то совсем в базу ничего не заносится

Покажите структуру Вашей БД

И никогда не закрывайте запрос в БД собачкой @, лучше замените на mysql_query($query) or die(mysql_error());

Спустя 4 минуты, 21 секунда (16.01.2011 - 15:23) Svetlaya написал(а):
Ну это я для примера создала. Потом если получится вставлю в реальный код.

Спустя 2 минуты, 5 секунд (16.01.2011 - 15:25) Snus написал(а):
Svetlaya
И вот, что я еще у Вас заметил на первых двух строчках:

function upload($_FILES,$url,$maxsize = 1024){
@mkdir("img", 777);


Директорию img он у вас создает, а не $url. Соответственно, если Вы выполните функцию upload($_FILES, 'test'); Файл он вам не запишет.

Спустя 5 минут, 27 секунд (16.01.2011 - 15:30) Svetlaya написал(а):
так в $fileDir у меня записано "img". Или это не правильно?

Спустя 1 минута, 47 секунд (16.01.2011 - 15:32) Snus написал(а):
Svetlaya


function upload($_FILES, $fileDir, $maxsize = 1024){
@mkdir($fileDir, 0777);
if(empty($_FILES['IMG']['tmp_name'])) return FALSE;
if($_FILES['IMG']['size'] > ($maxsize*1024)) return FALSE;

$ext = array(".gif", ".jpeg", ".jpg");
if(in_array(strrchr($_FILES['IMG']['name'],"."),$ext)){
$extt = substr($_FILES['IMG']['name'], -3);
$filePath = $fileDir.microtime().'_'.rand(1,99).'.'.$extt;
if(move_uploaded_file($_FILES['IMG']['tmp_name'], $filePath)) {
return $filePath;
} else { return FALSE; }
} else { return FALSE;}
}

Спустя 3 минуты, 13 секунд (16.01.2011 - 15:35) alex12060 написал(а):
сколько не пытался, все въехать не могу, что происходит с скриптом?

Спустя 8 минут, 24 секунды (16.01.2011 - 15:44) Svetlaya написал(а):
Всё равно не сохраняет. Может тут какая-то ошибка, в самом файле с формой?

<?php
require("config.inc.php");
require("functions.inc.php");
$link = mysql_connect($DBSERVER, $DBUSER, $DBPASS) or die("Не могу подключиться" );
mysql_select_db($DB, $link) or die ('Не могу выбрать БД');
mysql_query("SET NAMES utf8");
if($_POST['do'] =='') {
?>
<form
name="" action="?action=new" method="POST" enctype="multipart/form-data">
Загрузить изображение:<br/>
<input
type="file" name="IMG" /> <br/>
<input
name="do" type="submit" value="Сохранить"/>
</form>
<?php

}
else {
if(($filePath = upload($_FILES,$fileDir)) !== FALSE) {
$query = ("INSERT INTO img VALUES(NULL,'".$filePath."',)");
$q2 = @mysql_query($query);
if($q2) { echo 'Изображение добавлено'; }
}

else{echo 'Ошибка';}
}



?>


Ага. Картинки он сохранил мимо директории $fileDir, прямо в корень папки со скриптами, и в базу не внес.

Спустя 5 минут, 21 секунда (16.01.2011 - 15:49) inpost написал(а):
Svetlaya
Я бы советовал имя давать так: date("Y_m_d_H_i_s").'_'.md5('name'). То есть в начале будет дата писаться, далее md5 от базового имени. Тогда проблем вообще не будет, и в дальнейшем модерировать очень просто будет по дате.

Спустя 1 минута, 43 секунды (16.01.2011 - 15:51) inpost написал(а):
Ответ был на самый первый топик. Имя задаётся тут:
move_uploaded_file($_FILES['IMG']['tmp_name'], $url."/".md5(basename($_FILES['IMG']['name'])))

Добавь к md5 отдельно дату, проблемы сами уйдут.

Спустя 17 минут, 50 секунд (16.01.2011 - 16:09) Dron19 написал(а):
Цитата (Snus @ 16.01.2011 - 09:31)
Svetlaya
База данных должна быть примерно следующей структуры:

id | fileName | fileType | filePath | upDate

Где filePath - название файла (лучше даже полный путь к твоему файлу),

название это генерировать еще лучше так:

$fileDir = 'files/';

$ext = substr($_FILES['IMG']['name'], -3);
$filePath = $fileDir.microtime().'_'.rand(1,99).'.'.$ext;


и пишешь в базу $filePath, потом достаешь нужную запись в бд и генерируешь html-год:

$query = "SELECT `fileName`, `filePath` FROM `files` WHERE `id` = '1'";
$sql = mysql_query($query) or die(mysql_error());
list($fileName, $filePath) = mysql_fetch_array($sql);

echo '<h2>'.$fileName.'</h2>';
echo '<img src="'.$filePath.'" title="'.$fileName.'">';

ни в коем случае!!! А если расширение jpeg???? То у нее в базе будет лежать фотка с таким бредовым названием 2345925_56.peg И что дальше?

Спустя 32 секунды (16.01.2011 - 16:09) Dron19 написал(а):
вырезать тут лучше регуляркой!

Спустя 46 минут, 22 секунды (16.01.2011 - 16:56) alex12060 написал(а):

<?php
require("config.inc.php");
require("functions.inc.php");
$link = mysql_connect($DBSERVER, $DBUSER, $DBPASS) or die("Не могу подключиться" );
mysql_select_db($DB, $link) or die ('Не могу выбрать БД');
mysql_query("SET NAMES utf8");
if($_POST['do'] =='') {
?>


<form name="" action="?action=new" method="POST" enctype="multipart/form-data">
Загрузить изображение:<br/>
<input
type="file" name="IMG" /> <br/>
<input
name="do" type="submit" value="Сохранить"/>
</form>



<?php
}
else {
if(($filePath = upload($_FILES,$fileDir)) !== FALSE) {
$query = ("INSERT INTO img VALUES(NULL,'".$filePath."',)");
$q2 = @mysql_query($query);
if($q2) { echo 'Изображение добавлено'; }
}

else{echo 'Ошибка';}
}



?>


Давай разберем.
У тебя идет - соединение с БД.
Далее проверка, если параметр do пустой, то выводим форму, иначе, делаем загрузку.
Ну а какого фига у тебя в форме написано тогда: ?action=new

Будь аккуратнее в будущем ;)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.