2010-04-01 31 views
14

Tôi đang sử dụng PHP để tải hình ảnh từ biểu mẫu lên máy chủ và muốn đổi tên hình ảnh lastname_firstname. [Original extension]. Tôi hiện có:Đổi tên tệp đã tải lên bằng PHP nhưng giữ phần mở rộng

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]") 

, tất nhiên, đổi tên tệp lastname_firstname mà không có phần mở rộng. Làm cách nào để đổi tên tệp nhưng giữ phần mở rộng?

Cảm ơn!

Trả lời

28

Bạn cần phải đầu tiên tìm ra những phần mở rộng ban đầu là ;-)

Để làm điều đó, pathinfo chức năng có thể làm điều kỳ diệu ;-)


Trích dẫn ví dụ đó là đưa ra trong thủ công:

$path_parts = pathinfo('/www/htdocs/index.html'); 
echo $path_parts['dirname'], "\n"; 
echo $path_parts['basename'], "\n"; 
echo $path_parts['extension'], "\n"; 
echo $path_parts['filename'], "\n"; // since PHP 5.2.0 

sẽ cung cấp cho bạn:

/www/htdocs 
index.html 
html 
index 


Là một sidenote, đừng quên về an ninh:

  • Trong trường hợp của bạn, bạn nên thoát $_POST[lastname], để chắc chắn rằng nó chỉ chứa hợp lệ ký tự
  • Bạn cũng nên kiểm tra xem các tập tin là một hình ảnh
+0

Tôi cũng sử dụng is_uploaded_file() chức năng để kiểm tra xem các tập tin chúng tôi đang chỉ tay vào thực sự là một tập tin tải lên. –

+0

@Niels Bom: 'move_uploaded_file' thực hiện điều đó cho bạn. – zneak

+0

@zneak Tôi đã sửa. –

0
move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]." . pathinfo($_FILES["picture"]["tmp_name"], PATHINFO_EXTENSION)); 
+1

Đó là dòng mã * dài *, hầu hết các tiêu chuẩn mã hóa đều khuyến cáo điều đó vì khả năng đọc kém. Tôi đề nghị bạn theo dõi họ. –

2

tiên, tìm tiện ích mở rộng:

$pos = strrpos($filename, '.'); 
if ($pos === false) 
{ 
    // file has no extension; do something special? 
    $ext = ""; 
} 
else 
{ 
    // includes the period in the extension; do $pos + 1 if you don't want it 
    $ext = substr($filename, $pos); 
} 

Sau đó gọi tập tin của bạn dù sao đi nữa bạn muốn, và gắn liền với các tên phần mở rộng:

$newFilename = "foobar" . $ext; 
move_uploaded_file($_FILES['picture']['tmp_name'], 'peopleimages/' . $newFilename); 

EDIT tư duy của nó, không ai trong số này là tối ưu. Tiện ích mở rộng tệp thường xuyên nhất là mô tả loại tệp nhưng không phải lúc nào cũng như vậy. Ví dụ: bạn có thể đổi tên tệp .png thành đuôi .jpg và hầu hết các ứng dụng sẽ vẫn phát hiện tệp đó dưới dạng tệp png. Ngoài ra, một số hệ điều hành nhất định không sử dụng phần mở rộng tệp để xác định loại tệp.

Với $_FILE video tải lên, bạn cũng được cung cấp phần tử type đại diện cho loại MIME của tệp bạn đã nhận được.Nếu bạn có thể, tôi khuyên bạn nên dựa vào nó thay vì trên tiện ích mở rộng đã cho:

$imagetypes = array(
    'image/png' => '.png', 
    'image/gif' => '.gif', 
    'image/jpeg' => '.jpg', 
    'image/bmp' => '.bmp'); 
$ext = $imagetypes[$_FILES['myfile']['type']]; 

Bạn có thể có more complete list of MIME types here.

+0

tôi bỏ lỡ r đôi! bạn là đúng ạ! – mote

0

bạn có thể luôn:

$original = explode('.', $_FILES["picture"]["tmp_name"]); 
$extension = array_pop($original); 

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]". $extension); 
4

Bạn có thể thử:

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]".".".end(explode(".", $_FILES["picture"]["tmp_name"]))) 

hoặc như Niels Bom đề nghị

$filename=$_FILES["picture"]["tmp_name"]; 
$extension=end(explode(".", $filename)); 
$newfilename="$_POST[lastname]" . '_' . "$_POST[firstname]".".".$extension; 
move_uploaded_file($filename, "peopleimages/" .$newfilename); 
+0

Đó là dòng mã * dài *, hầu hết các tiêu chuẩn mã hóa đều khuyên bạn không nên đọc. Tôi đề nghị bạn theo dõi họ. –

+0

điều này sẽ dễ đọc hơn .. :-) – kviksilver

4

Dont quên nếu bạn đang cho phép mọi người tải lên tập tin tùy ý, mà không kiểm tra phần mở rộng, chúng có thể tải lên một tệp .php hoàn hảo và thực thi mã trên máy chủ của bạn;)

Các quy tắc .htaccess để từ chối thực hiện php bên trong một thư mục nào đó là một cái gì đó như thế này (may cho thiết lập của bạn) ..

AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi 
Options -ExecCGI 

Đặt này vào một tập tin .htaccess vào thư mục mà bạn đang tải lên file .

Nếu không, hãy nhớ rằng các tệp có thể có nhiều "." trong họ, và bạn nên vàng.

3

mã này là không an toàn

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]". $extension); 

nếu

$_POST[firstname] =mypicture.php%00 

$extension=.jpg; 

mã này là dễ bị tổn thương và kết quả là

test.php%00.jpg //test.php uploaded on server. 

để biết thêm thông tin kiểm tra liên kết này:

https://www.owasp.org/index.php/Unrestricted_File_Upload

Các vấn đề liên quan