2015-09-08 2 views
1

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

$newfilename = round(microtime(true)) . ".jpg"; 

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

Например, в одном случае, изображение в базе данных записывается как 1441743610.jpg, в то время как изображение в директории 1441743609.jpg.

Это мой код:

session_start(); 

$username = $_SESSION['username']; 

$file_dir = "userpictures/$username" ; 

mkdir($file_dir, 0777, true); 

// $_FILES["file"]["name'] is the file that is uploaded by her 

$filePath = $_FILES["file"]["name"]; 
$image = imagecreatefrompng($filePath); 
$bg = imagecreatetruecolor(imagesx($image), imagesy($image)); 
imagefill($bg, 0, 0, imagecolorallocate($bg, 255, 255, 255)); 
imagealphablending($bg, TRUE); 
imagecopy($bg, $image, 0, 0, 0, 0, imagesx($image), imagesy($image)); 
imagedestroy($image); 
$quality = 100; // 0 = worst/smaller file, 100 = better/bigger file 
imagejpeg($bg, $filePath . ".jpg", $quality); 
imagedestroy($bg); 

// this chunk here converts the file to jpg 


$newfilename = round(microtime(true)) . ".jpg"; 
// round(microtime) generates a randomized number. 


// check format of image before uploading 
$imageFileType = pathinfo($newfilename,PATHINFO_EXTENSION); 

if ($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" 
&& $imageFileType != "gif") 

{ 
echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed."; 
$uploadOk = 0; 
} 

else 

{ 
$uploadOk = 1; 
} 


// if any errors have occured (determined by $uploadOk), the critical "move_uploaded_files" php function is not activated 

if ($uploadOk == 1) 

{ 
$filename = $newfilename; 
move_uploaded_file($_FILES["file"]["tmp_name"], "user_pictures/$username/" . $filename); 
} 

Оценил советовать о том, почему это происходит. Обратите внимание, что это поведение несовместимо, и он довольно часто работает ., но это не приемлемо для меня.

EDIT:

Это код, где я загрузить $filename в базу данных (а также другие данные)

$con = mysqli_connect("FARM.mysql.anyhost.com", "user", "password"); 
    if (!$con) { 
    die("Something went wrong. Don't worry, just refresh the page"); } 

mysqli_select_db($con, "FARM"); 
    if (mysqli_select_db($con, "FARM") == false) { 
    die("Something went wrong. Don't worry, just refresh the page"); } 

$username = $_SESSION['username']; 
$post = mysqli_real_escape_string($con, $_POST['postdescription']); 
$timestamp = date("jS \of F Y h:i:s A P"); 


$user_uploadposts = "INSERT INTO $username (PostingTime, Image, Description) VALUES ('$timestamp','$filename', '$post')"; 


mysqli_query($con, $user_uploadposts); 
mysqli_close($con); 

ответ

1

Я не знаю, как ваш запрос при сохранении в FilePath базы данных, но в соответствии с приведенным здесь поведением:

Обратите внимание, что это поведение несовместимо, и оно работает большую часть времени., но это не подходит для меня.

проблема заключается в том, что вы не используете $ newfilename при сохранении в базу данных, но «воссоздание» имя файла снова $newfilename = round(microtime(true)) . ".jpg";

Это вызывает, что в это время микропоры является приращение и имена не являются равный больше. Причина, по которой он иногда работает, заключается в том, что сценарий проходит быстрее. Чтобы этого избежать, вам просто нужно использовать $ newfilename вместо создания переменной снова.

h.u.

+0

Я решил сохранить $ newfilename как переменную SESSION. Затем эту переменную SESSION вызывают при вставке в базу данных, тем самым избегая вызова $ newfilename в два раза (и, как вы объяснили, снова генерируете микросрочное время). Как вы думаете, это разрешит это? 'else {\t move_uploaded_file ($ _ FILES [" hello "] [" tmp_name "]," user_pictures/$ username/". $ newfilename); \t $ _SESSION ['filename'] = $ newfilename;} ' – blurgoon

+0

Да, это решит проблему. Но я не думаю, что его хорошая идея сохранить его в сеансе, сеанс не создан для этой цели. – hesyar

+0

или, может быть, просто переменная снова? так что '$ thisfilename = $ newfilename' Но мне интересно, если я снова вызову $ thisfilename, будет ли он снова вычислять значение $ newfilename, которое тогда будет равно новому микротому или будет ссылаться только на значение $ newfilename в то время, когда он был создан? Вы получаете то, что я говорю? – blurgoon