Я хочу разрешить пользователям загружать изображения без проблем, которые могут быть вызваны несколькими пользователями, загружающими изображения, которые потенциально имеют одинаковое имя изображения. Я в тупике о том, как это выполнить, и я понятия не имею, с чего начать.
Вот мой код:
if(isset($_POST['submitimage'])){ move_uploaded_file($_FILES['file']['tmp_name'],"pictures/".$_FILES['file']['name']); $con = mysqli_connect("localhost","root","","database"); $q = mysqli_query($con,"UPDATE users SET image = '".$_FILES['file']['name']."' WHERE user_id = '".$_SESSION['user']."'"); header("Location: index.php"); } ?>
Любая помощь будет потрясающей. Спасибо!
Мое решение состоит в создании случайной строки для каждого загруженного файла, то есть:
<?php if(!empty($_POST['submitimage'])){ //get file extension. $ext = pathinfo($_FILES['file']['name'])['extension']; //generate the new random string for filename and append extension. $nFn = generateRandomString().".$ext"; move_uploaded_file($_FILES['file']['tmp_name'],"pictures/".$nFn); $con = mysqli_connect("localhost","root","","database"); $q = mysqli_query($con,"UPDATE users SET image = '{$nFn}' WHERE user_id = '{$_SESSION['user']}'"); header("Location: index.php"); } function generateRandomString($length = 10) { return substr(str_shuffle("abcdefghijklmnopqrstuvwxyz"), 0, $length); } ?>
PHP имеет встроенную функцию для создания уникальных файлов на вашем сервере. Эта функция известна как tempnam () . Если вы внимательно прочитаете комментарии на этом веб-сайте, есть небольшая вероятность, что вы получите нежелательное поведение от этой функции, если многие процессы одновременно вызовут ее. Таким образом, модификация этой функции будет следующей:
<?php function tempnam_sfx($path, $suffix){ do { $file = $path."/".mt_rand().$suffix; $fp = @fopen($file, 'x'); } while(!$fp); fclose($fp); return $file; } ?>
в<?php function tempnam_sfx($path, $suffix){ do { $file = $path."/".mt_rand().$suffix; $fp = @fopen($file, 'x'); } while(!$fp); fclose($fp); return $file; } ?>
Поскольку файл остается открытым во время его создания, к нему нельзя получить доступ другим процессом, и поэтому невозможно создать 2 файла с тем же именем, просто потому, что несколько посетителей вашего сайта случайно загрузили фотографии в тот же момент , Итак, чтобы реализовать это в своем собственном коде:
<?php function tempnam_sfx($path, $suffix){ do { $file = $path."/".mt_rand().$suffix; $fp = @fopen($file, 'x'); } while(!$fp); fclose($fp); return $file; } $uploaddir = 'pictures'; // Upload directory $file = $_FILES['file']['name']; // Original file $ext = pathinfo($path, PATHINFO_EXTENSION); // Get file extension $uploadfile = tempnam_sfx($uploaddir, $ext); move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile); $con = mysqli_connect("localhost","root","","database"); $q = mysqli_query($con,"UPDATE users SET image = '".basename($uploadfile)."' WHERE user_id = '{$_SESSION['user']}'"); header("Location: index.php"); ?>
в<?php function tempnam_sfx($path, $suffix){ do { $file = $path."/".mt_rand().$suffix; $fp = @fopen($file, 'x'); } while(!$fp); fclose($fp); return $file; } $uploaddir = 'pictures'; // Upload directory $file = $_FILES['file']['name']; // Original file $ext = pathinfo($path, PATHINFO_EXTENSION); // Get file extension $uploadfile = tempnam_sfx($uploaddir, $ext); move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile); $con = mysqli_connect("localhost","root","","database"); $q = mysqli_query($con,"UPDATE users SET image = '".basename($uploadfile)."' WHERE user_id = '{$_SESSION['user']}'"); header("Location: index.php"); ?>
Один из способов сделать это – это создать несколько случайных чисел (и, возможно, привязать их к текущей дате в числовом формате) и дать изображению последовательность чисел.
if(isset($_POST['submitimage'])){ //generate 3 sequences of random numbers,you could do more or less if you wish $randomNumber=rand().rand().rand(); move_uploaded_file($_FILES['file']['tmp_name'],"pictures/".$randomNumber."jpg"); $con = mysqli_connect("localhost","root","","database"); $q = mysqli_query($con,"UPDATE users SET image = '".$randomNumber.".jpg' WHERE user_id = '".$_SESSION['user']."'"); header("Location: index.php"); } ?>
Примечание. Вы также можете посмотреть на генерацию случайных строк, если числа не являются вашей вещью.