У меня есть следующий скрипт, который генерирует случайную метку времени для моего имени файла.Имя файла, записанного в каталоге, отличается от базы данных
$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);
Я решил сохранить $ newfilename как переменную SESSION. Затем эту переменную SESSION вызывают при вставке в базу данных, тем самым избегая вызова $ newfilename в два раза (и, как вы объяснили, снова генерируете микросрочное время). Как вы думаете, это разрешит это? 'else {\t move_uploaded_file ($ _ FILES [" hello "] [" tmp_name "]," user_pictures/$ username/". $ newfilename); \t $ _SESSION ['filename'] = $ newfilename;} ' – blurgoon
Да, это решит проблему. Но я не думаю, что его хорошая идея сохранить его в сеансе, сеанс не создан для этой цели. – hesyar
или, может быть, просто переменная снова? так что '$ thisfilename = $ newfilename' Но мне интересно, если я снова вызову $ thisfilename, будет ли он снова вычислять значение $ newfilename, которое тогда будет равно новому микротому или будет ссылаться только на значение $ newfilename в то время, когда он был создан? Вы получаете то, что я говорю? – blurgoon