2017-02-18 83 views
0

你好,我目前能夠上傳文件到我的網站上的文件夾,但我無法完全理解我應該如何能夠從我的文件到我的數據庫獲得路徑... enter image description here圖片上傳到mysql

<?php 
if(isset($_FILES['file'])) 
{ 

move_uploaded_file($_FILES['file']['tmp_name'],'files/'.$_FILES['file']['name']); 

session_start(); 
$username = $_SESSION['user']; 
$userpic = ???? <-- what am i supposed to call here to put the path to my image file 

include ("connect.php"); 
$sql = $con->prepare('INSERT INTO users (username,userpic) VALUES (?,?)'); 
$sql->bind_param("ss",$username,$userpic); 
$sql->execute(); 
$sql->close(); 
$con->close(); 
} 
else{ 
echo "no files"; 
} 
?> 

所以這樣的事情東西應該的工作是當有人上傳圖像應該得到直接插入「userpic」表中的形象,香港專業教育學院讀其他職位喜歡這個,但他們是不是完全一樣的..我應該怎麼這是什麼成績?謝謝你的幫助!! (不是最亮的PHP,但即時通訊嘗試)

回答

1

如果存儲使用客戶端提供的名稱文件時,文件上傳,你將有可能改寫圖像(例如,如果兩個用戶上傳me.png) - 這將是更好的使用用戶名存儲圖像,然後你甚至不需要MySQL表將用戶連接到他們的圖片..

<?php 
session_start(); 
$username = $_SESSION['user']; 
if(empty($username)){ 
    echo "Error: no username found"; 
} 
else if(isset($_FILES['file'])){ 
    //create a path to move file to 
    $newpath = 'files/'.$username; 

    if (move_uploaded_file($_FILES['file']['tmp_name'], $newpath)) { 
    echo "File is valid, and was successfully uploaded.\n"; 
    } else { 
    echo "Error: Possible file upload attack!\n"; 
    } 
} 
else{ 
    echo "No Files to save"; 
} 

在這段代碼中,我們使用的用戶名從會話,並檢查其不爲空。 然後,我們使用它來將圖像存儲在您的文件夾中。

注意這個數字忽略了許多安全問題:

包括你的用戶名../這將導致文件要保存的文件目錄之外。 這可能不是一個問題,如果你已經驗證了用戶名,另一種解決方案是創建用戶名的哈希值,並使用這個代替:$newpath = 'files/'.md5($username);

不檢查錯誤,或者驗證文件確實是一個圖像。

http://php.net/manual/en/features.file-upload.errors.php

PHP image upload security check list

如何將這些圖像將會在此之後被使用? 如果文件目錄位於您的htdocs中,則內容將可用於所有 - 最好將它存儲在您的htdoc之外 $newpath = '/var/myappdata/userimages/'.md5($username);

然後,您可以創建另一個文件userimage.php其內容的文件:

<?php 
session_start(); 
$username = $_SESSION['user']; 
$path = '/var/myappdata/userimages/'.md5($username); 
readfile($path); 

這允許你做例如額外檢查允許用戶看到圖像。

仍然有可能在這裏介紹一個巨大的數額,希望這給你足夠的前進,但是請您把這個投入生產之前閱讀更多關於文件上傳的安全性。

你原來的問題

如果你確實想存儲有關數據庫中的圖像信息,你可以做這樣的事情:

<?php 
session_start(); 
include ("connect.php"); 

$username = $_SESSION['user']; 
if(empty($username)){ 
    echo "Error: no username found"; 
} 
else if(isset($_FILES['file'])){ 
    //create a path to move file to 
    $filename = basename($_FILES['file']['name']); 

    $newpath = 'files/'.$filename; 
    if (move_uploaded_file($_FILES['file']['tmp_name'], $newpath)) { 
     echo "File is valid, and was successfully uploaded.\n"; 
     $sql = $con->prepare('INSERT INTO users (username,userpic) VALUES (?,?)'); 
     $sql->bind_param("ss",$username,$filename); 
     $sql->execute(); 
     $sql->close(); 
     $con->close();   
    } else { 
     echo "Error: Possible file upload attack!\n"; 
    } 
} 
else{ 
    echo "No Files to save"; 
} 

正如我雖然說的 - 你會碰上如果兩個衝突用戶上傳相同的文件。

+0

所以我應該刪除我的整個SQL問題,只寫代碼?它並沒有爲我工作 –

+0

我已經更新了我的答案 – Theo

+0

Thnaks很多解釋我會更多地瞭解如何保護自己,當上傳圖片.. –

0

你不會想要將整個URL存儲在數據庫中。您只需要它在服務器上的路徑。這是您將tmp文件移動到新位置的部分。在你的情況下,這將是以下內容。

$userpic = 'files/'.$_FILES['file']['name'];