2012-03-07 5 views
1

Мне нужно указать количество файлов в качестве загрузки. Я использую SFWUpload. У меня есть этот код:Переименовать файлы, увеличивающиеся при их загрузке - PHP

mkdir("../../imagenes/".$codigo , 0777); 
$i = 1; 
$nombre = $codigo.'_'.$i.'.jpg'; 
move_uploaded_file($_FILES['Filedata']['tmp_name'], "../../imagenes/".$codigo."/".$nombre); 
chmod("../../imagenes/".$codigo."/".$_FILES['Filedata']['name'], 0777); 

в $ Codigo является код, например 101213, поэтому мне нужны фотографии для загрузки как 101213_1.jpg, 101213_2.jpg, 101213_3.jpg, и так далее.

Проблема в том, что SWFUpload запускает php ONCE на изображение, поэтому я не могу использовать цикл foreach (я думаю).

Мне нужен скрипт, чтобы проверить, существует ли файл и написать следующее. Например, если существует 101213_4.jpg, напишите 101213_5.jpg.

Можете ли вы мне помочь, как я могу это сделать? Я новичок в php и пробовал все! :(

Заранее спасибо

Роберто

+0

Покажите нам ваши «все» попытки, то мы можем начать оттуда :) –

+0

сохранить номер где-то и использовать этот номер – undone

+0

«everithing» является подсчет файлов, проверка если файл существует, даже использование сеанса, но ничего не работает.! :( –

ответ

0

Ну ... вы можете попытаться получить текущее количество файлов в папке и получить $i оттуда:

mkdir("../../imagenes/".$codigo , 0777); 
$i = count(glob("../../imagenes/".$codigo.'_*.jpg')) + 1; 
$nombre = $codigo.'_'.$i.'.jpg'; 
move_uploaded_file($_FILES['Filedata']['tmp_name'], "../../imagenes/".$codigo."/".$nombre); 
chmod("../../imagenes/".$codigo."/".$nombre, 0777); 

Попробуйте этот код ...

+0

Это сработало! Благодаря.!! Я сделал это изменение в этой строке кода. !! $ i = count (glob ("../../ imagenes /".$ codigo."/*. Jpg ")) + 1; Спасибо.! ;) –

+0

Что происходит, когда два человека пытаются загрузить одновременно? –

+0

Я думаю об этом ... но как вы избегаете этого состояния гонки между процессами PHP? возможно, с помощью семафоров? sem_get, sem_acquire и т. д. – eagleoneraptor

1

Вот функция, я использую:

function cleanup_name($name){ //accepts name and cleans it up. 
$finalDir='/home/username/uploads'; 

# Go to all lower case for consistency 
$name = strtolower($name); 
//echo("Name is $name<br>"); 

$matches=split('\.',$name); 
foreach ($matches as $key=>$value){ 
$exkey=$key; 
$exvalue=$value; //if there is more than one period, this will find the actual extension. 
//echo("Key $key|$exkey Value $value|$exvalue<br>"); 
} 

if ($exkey<1){die('The file must have an extension.');} 
$extension=".".$exvalue; 
$loop=0; 
while ($loop<($exkey)){ 
if ($loop<($exkey-1)){$matches[$loop]=".".$matches[$loop];} // this puts extra periods back into the string, but the borrowed code will replace them with underscores. 
$stem.=$matches[$loop]; 
$loop++; 
} 

//echo("Stem is $stem<br>"); 
//echo("Extension is $extension<br>"); 

# Convert whitespace of any kind to single underscores 
$stem = preg_replace('/\s+/', '_', $stem); 

# Remove any remaining characters other than A-Z, a-z, 0-9 and _ 
$stem = preg_replace('/[^\w]/', '', $stem); 

# Make sure the file extension has no odd characters 
if (($extension != '') && 
    (!preg_match('/^\.\w+$/', $extension))) 
{ 
    echo("odd characters in extension"); 
    //die("Bad file extension"); 
    return FALSE; 
} 

$safeExtensions = array(
'.zip', 
'.psd', 
'.pdf', 
'.jpg', 
'.jpeg', 
'.gif', 
'.rar', 
'.gz', 
'.ai', 
'.eps', 
'.bmp', 
'.pub', 
'.xls', 
'.doc', 
'.wpd', 
'.rtf', 
'.tiff', 
'.tif', 
'.pcx', 
'.ttf', 
'.png', 
'.txt', 
'.mp3', 
'.avi', 
'.mov', 
'.wav' 
); 

if (!in_array($extension, $safeExtensions)) { 
    echo("Extension &quot;$extension&quot; not approved."); 
    //die("File extension not approved"); 
    return FALSE; 
} 

# Search for a unique filename by adding a number to the 
# stem (first we try without, of course) 

$suffix = ''; 
while (file_exists($finalDir."/".$stem.$suffix.$extension)) { 
    if ($suffix == '') { 
    $suffix = '0'; 
    } else { 
    $suffix++; 
    } 
} 

# Put the full name back together 
$name = "$stem$suffix$extension"; 
return $name; 
} 

Обратите особое внимание на раздел с этим: "While (file_exists ..."

+0

использовать комментарий, не отправлять ответ ;-) – undone

+0

Проблема в том, что у вас есть циклы здесь .. С петлями легко кодировать инкрементное, но в моем случае я не могу использовать циклы. Спасибо, в любом случае.! xD –

+0

Я думаю, вы неправильно понимаете, что делает файл. Он достаточно петлится, чтобы найти правильное имя файла, а затем записывает один файл. '$ suffix = ''; while (file_exists ($ finalDir. "/". $ stem. $ suffix. $ extension)) {if ($ suffix == '') {$ suffix = '0'; } else {$ suffix ++; }} 'Это действительно единственная часть, которая вам нужна, но я думал, что мои имена переменных будут иметь больше смысла в контексте. – TecBrat

Смежные вопросы