2016-05-29 37 views
2

我希望允許用戶上傳圖像,而不會出現多個用戶上傳可能具有相同圖像名稱的圖像可能導致的問題衝突問題。我難倒就如何執行這一點,我不知道從哪裏開始..爲上傳的圖像提供mysqli的唯一名稱

這裏是我的代碼:

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"); 
     } 
?> 

任何幫助將是驚人的。謝謝!

+0

而不是'$ _FILES ['file'] ['name']'爲文件名生成一個隨機字符串。 –

回答

2

我的解決方案是爲每一個上傳的文件隨機字符串,即:

<?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); 
} 

?> 
+0

這是完美的。非常感謝你的時間和幫助。 – kenny

+0

非常歡迎@kenny –

+0

如果他有很多遊客在同一時刻上傳圖片,會發生什麼?我的意思是,你的解決方案很好,但我知道隨機生成器在發生這種情況時往往會遇到麻煩。 – icecub

0

你可以做到這一點的一種方法是通過生成一些隨機數(並可能將它們附加到數字格式的當前日期)並給圖像數字序列。

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"); 
    } 
?> 

注意:您還可以看看generating random strings如果數字是不是你的事。

+0

謝謝你的時間和幫助! – kenny

1

PHP在功能構建到生成您的服務器上的唯一文件。該功能被稱爲tempnam()。如果您仔細閱讀了該網站上的評論,那麼如果多個進程同時調用該功能,您很可能會從該功能獲得不想要的行爲。所以這個功能的修改情況如下:

<?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"); 

?>