2013-03-17 2 views
0

У меня есть FileUpload с PHP, но это не имеет значения, потому что моя реальная проблема заключается в том, что у меня есть этот код:Странные результаты с SubStr и MKDIR функции в PHP

if (!empty($_FILES)) { 
    $tempFile = $_FILES['Filedata']['tmp_name']; 
$real = $_FILES['Filedata']['name']; 
$finfo = pathinfo($real); 
$time = time(); 
$rand1 = substr(sha1($real.$time),0,4); 
$rand2 = substr(sha1($real.$time),5,-22); 
$fname = preg_replace("#[^A-Za-z1-9]#","_", $_FILES['Filedata']['name']); 
mkdir(UPLOAD_TO."/".$rand2,0777); 
$targetFile = UPLOAD_TO."/".$rand2."/".$real; 
      move_uploaded_file($tempFile,$targetFile); 
    $query = $db->prepare("INSERT INTO files (realname,filename,extension,filesize,rand1,rand2,uppedby,created) VALUES(:real,:filename,:extension,:filesize,:rand1,:rand2,:uppedby,:created)"); 
$query->execute(array(
":real" => $real, 
":filename" => $fname, 
":extension" => $finfo['extension'], 
":filesize" => filesize($tempFile), 
":rand1" => $rand1, 
":rand2" => $rand2, 
":uppedby" => $_SERVER['REMOTE_ADDR'], 
":created" => time() 
)); 

} 

файл будет загружен, и я создания SHA1 хэш от фактической метки времени и реального имени файла. После того, как я разрезаю их substr(), но есть сложная часть. Mkdir создает каталог не с вырезанной строкой, а со странными другими комбинациями. Я не знаю, что я делаю неправильно. Не могли бы вы взглянуть на него?

+1

что такое '$ do =;' ?? – Davit

+0

i edit it thanks – rsz

ответ

1

$rand2 = sha1(sha1($real.$time),0,4);

это должно быть $rand2 = substr(sha1($real.$time),0,4); # RAND2

и удалите $do = ;

Under "dev mod" an error would show up: 

Warning: sha1() expects at most 2 parameters, 3 given 

Это просто у вас есть опечатка или что-то подобное

Я сделал быструю проверку на моем локальном сервере с таким кодом и он работает

<?php 
DEFINE('UPLOAD_TO',"C:/env/php/www/tests/"); 
if (!empty($_FILES)) 
{ 
    $tempFile = $_FILES['Filedata']['tmp_name']; 
    $real = $_FILES['Filedata']['name']; 
    $finfo = pathinfo($real); 
    $time = time(); 
    $rand1 = substr(sha1($real.$time),0,4); 
    $rand2 = substr(sha1($real.$time),5,-22); 
    $fname = preg_replace("#[^A-Za-z1-9]#","_", $_FILES['Filedata']['name']); 
    mkdir(UPLOAD_TO."/".$rand2,0777); 
    $targetFile = UPLOAD_TO."/".$rand2."/".$real; 
    move_uploaded_file($tempFile,$targetFile); 
} 
?> 
<form method="POST" enctype="multipart/form-data" action=""> 
    <input type="file" name="Filedata" /> 
    <input type="submit" /> 
</form> 

Вы можете проверить это, но проблема в том, ваша sha1 функция, которая должна быть заменена substr

Update 2

Поскольку у вас есть проблемы с именем вашей папки и недовольны его именем, вы можете попробовать изменить $rand2 = substr(sha1($real.$time),5,-22); на $rand2 = substr(sha1($real.$time),1,5);

Прочтите руководство по substr по адресу php.net substr и подберите его под свои нужды, это очень простой способ.

Три аргумента substr: $STRING, $START and $LENGTH which is optional. Выдержка из php.net может очистить все это для вас:

Если старт не является отрицательным, то возвращаемая строка будет начинаться с позиции start'th в строке, считая от нуля. Например, в строке «abcdef» символ в позиции 0 равен «a», символ в позиции - «c» и т. Д.

На моем взгляде, следующая часть будет очистить свой ум об этом более (обратите внимание на отрицательную часть)

Если длина задана и положительно, то возвращаемая строка будет содержать по большей длине символы, начинающиеся с начала (в зависимости от длины строки ).

Если длина задана и является отрицательным, то, что многие символами будут опущены от конца строки (после того, как начальная позиция была вычисленных при старт является отрицательным).Если start обозначает позицию это усечение или больше, то возвращается false.

+0

Я удалил часть '$ do =;', но она не решает главную проблему. – rsz

+0

вы исправили функцию sha1 с тремя аргументами? – Davit

+0

с тремя? Зачем? на php.net есть только 2 аргумента max. http://php.net/manual/en/function.sha1.php – rsz

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