2009-03-31 36 views
6

Làm cách nào để đổi tên tệp trước hoặc sau khi tệp được tải lên? Tôi chỉ muốn đổi tên tên tệp chứ không phải phần mở rộng.Làm cách nào để đổi tên một tên tệp sau khi tải lên bằng php?

$changeTXT = $_SESSION['username']; 
$uploaderName = strtolower($changeTXT); 
$changeTXT = strtolower($changeTXT); 
$changeTXT = ucfirst($changeTXT); 
$filelocation = $_POST['userfile']; 
$filename = $_POST['filename']; 
$max_size = $_POST['MAX_FILE_SIZE']; 

$file = $_FILES['userfile']; 

$allowedExtensions = array("wma", "mp3", "wav"); 

function isAllowedExtension($fileName) { 
    global $allowedExtensions; 

    return in_array(end(explode(".", $fileName)), $allowedExtensions); 
} 

if($file['error'] == UPLOAD_ERR_OK) { 
    if(isAllowedExtension($file['name'])) { 

$uploaddir = "uploads/".$uploaderName."/"; 

$uploadfile = $uploaddir . basename($_FILES['userfile']['name']); 

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { 

    echo "Thank you for uploading your music!<br /><br />"; 

} else { 

    echo "Your file did not upload.<br /><br />"; 

} 

    echo "\n"; 

    echo "<a href='index.php'>Return</a> to index.<br /><br />$uploaddir"; 

} else { 

    echo "You have tried to upload an invalid file type.<br /><br />"; 

    } 

} else die("Cannot upload"); 
+0

Câu hỏi hay! Upvoted !! – MJQ

Trả lời

22

Khi sử dụng move_uploaded_file bạn có thể chọn tên tệp để bạn có thể chọn bất cứ thứ gì mình muốn.

Khi bạn tải tệp lên, thư mục được đưa vào thư mục tạm thời có tên tạm thời, move_uploaded_file() cho phép bạn di chuyển tệp đó và trong đó bạn cũng cần đặt tên tệp.

+0

Câu trả lời hay! Chắc chắn cần một upvote! – MJQ

+1

bất kỳ ví dụ 'mã' nào? – yaqoob

1

Khi bạn làm

$uploadfile = $uploaddir . basename($_FILES['userfile']['name']); 

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { 

Chỉ cần đặt $ uploadfile cho toàn bộ đường đi của tên tập tin mong muốn; tức là "uploads/mynewfilename.jpg"

3

Tại sao không chỉ cần lưu nó với một cái tên khác:

Chỉ cần thay đổi tên của $ uploadfile biến:

$uploadfile = $uploaddir . "somefilename" . end(explode(".", $file['name'])); 

Nó sẽ không làm tổn thương tuy nhiên nếu bạn refactord mã của bạn một chút.

6

Tôi khuyên bạn nên xem lớp Tải lên tệp của Verot. Nó chữa lành rất nhiều đau đớn của tải lên tập tin thông qua php, và làm cho mã của bạn dễ đọc hơn/duy trì.

Dưới đây là link to the class và tài liệu.

Để trả lời chính xác cho câu hỏi của bạn: Để đặt tên mới cho tệp được tải lên, hãy đặt nó làm đối số thứ hai cho hàm move_uploaded_file() của bạn.

Vì bạn muốn giữ lại phần mở rộng, lưu trữ nó lần đầu tiên trong một biến:

$ext = explode('.',$_FILES['uploaded']['name']); 
$extension = $ext[1]; 

Bạn có thể sử dụng tên tập tin gốc để tạo ra tên mới (ở đây, với một dấu thời gian nối vào nó):

$newname = $ext[0].'_'.time(); 

Giả sử bạn đã tải lên tệp và tên biến đầu vào của biểu mẫu là "myfile.png", nó sẽ trở thành 'myfile_2343544.png';

Bây giờ, kết hợp các đường địa phương để các thư mục đích, var $ newname và phần mở rộng của tập tin để thiết lập số thứ hai của hàm:

$full_local_path = 'path/to/your/filefolder/'.$newname.'.'.$extension ; 
move_uploaded_file($_FILES['uploaded']['tmp_name'], $full_local_path); 
+1

Alllllmost. Nhưng bạn cần $ newname.$ extension ", thêm một khoảng thời gian giữa tên mới và phần mở rộng, nếu không nó sẽ xuất hiện" filenamejpg ".Đánh dấu! – Cyprus106

+1

Tôi bị mất chính mình trong khoảng trống giữa các dấu chấm ... Rất đẹp, cảm ơn !! – pixeline

1

Bạn có thể sử dụng param thứ hai trong move_uploaded_file để thiết lập tên tập tin. Tham số đầu tiên là tên tệp của tệp trong thư mục/tmp của bạn và tham số thứ hai là tệp dir và tên tệp mới.

move_uploaded_file($_FILES['file']['tmp_name'], "/new/file/dir/".[the new file name]); 

Tôi biết đây là câu hỏi cũ nhưng không có câu trả lời rõ ràng.

0
<?php 

    /* 
    Just change the $path variable to your uploads path 
    and dont forget the/at the end of the path. 

    The way this function works is .When the user submits the form 
    the uniqueFilename() function checks to see if there is a filename 
    in your uploads folder, that has the same name as the one you intend 
    to upload. If it finds a filename that has the same name as the one you want to 
    upload it goes through the next steps 


     Step 1 

    strrpos($arg1,$arg2) - we use it to find the location where upload path ends and where the filename begins 

    $arg1 = the filepath including the filename ex. uploads/myFile.jpg 
    $arg2 = basename($filename); what this does is it strips the path from the string and returns only the filename. 

    When we use strrpos($arg1,$arg2) we basically tell the function to find the position of the path and exclude the filename 

    Step 2 

    substr($arg1,$arg2,$arg3) - looks in a string and extrats only the parts from the string that you want. We use it now to extract the uploads path. 

    $arg1 = the full path of the uploaded file. ex. uploads/myFile.jpg 
    $arg2 = 0 because we want to start from the begginning of the string 
    $arg3 = $pathlocation which is the location of where the uploadpath ends and the file beggins 

    when we use substr() here we intend to extract the uploads path. 

    Step 3 

    basename($arg1) strips out a path and returns the filename 

    - we use this to save the original filename 

    Notice that so far we have the path to the files saved and also 
    the filename with its extension. We also have the file extension (.jpg|.png) or whatever 


    Step 4 

    pathinfo() - extracts the extension from the filename 

    Step 5 

    we us strrpos() to find the location of the last dot (.) in the filename because in step 6 
    we use this location to cut the string where the dot (.) is 

    Step 6 

    substr() gets the file without the extension 

    Step 7 
    substr() takes the filename without extension and clips out the last charcter 
    so if the filename is myFile this function would return myFil 

    Step 8 
    substr() again we use it to save the last character of the file so 
       if our file is called myFile it would return e. 

    Step 9 
    Here we check to see if the last character of our file is numeric. 
    Why do this? Because if the last character of a file is numeric we can just add a number to the 
    file and end up with a new file with an added number so our file is 
    myFile1 the 1 is numeric so our intention is to add to it 
    so my myFile1 would end up being myFile2. But what happens if our last character is not numeric? 

    then we just add -1 to the file so that myFile would end up being myFile-1 

    Step 10 
    Since our filename exists in the database we must call the function uniqueFilename() again so that we can 
    check and see if the new name exists in the database. 

    This function basically keeps calling itself until it finds a filename that does not exists. 
    */ 





    if(isset($_POST['submit'])){ 

    $path = "uploads/"; 

    $fullPath = $path.$_FILES['uploadFile']['name']; 
    $full_local_path = $path.uniqueFilename($fullPath) ; 
    move_uploaded_file($_FILES['uploadFile']['tmp_name'], $full_local_path); 
    } 
      /* 
      * Function returns a unique filename 
      * Param 1 is the path of the filename and the filename 
      * returns filename with no path 
      */ 
      function uniqueFilename($filepathAndFilename){ 

       // check to see if file exists 
       if (file_exists($filepathAndFilename)) 
       { 
         /* step 1 */ 

        //Get the path location without the basename 
        $filePathWithoutFilenameLocationInString = strrpos($filepathAndFilename,basename($filepathAndFilename)); 

         /* step 2 */ 

        //Get the path and cut the basename 
        $path = substr($filepathAndFilename,0,$filePathWithoutFilenameLocationInString); 

         /* Step 3*/ 
        //Get the base filename 
        $filename = basename($filepathAndFilename); 

         /* Step 4 */ 
         // get the extension 
        $fileExtension = pathinfo($filename, PATHINFO_EXTENSION); 

         /* Step 5 */ 
        // find the position of the last dot 
        $dotLocation = strrpos($filename,'.'); 

         /* Step 6 */ 
        // Get the filename without the dot 
        $fileWithNoExtension = substr($filename,0,$dotLocation); 

         /* Step 7 */ 
        //Get the name without the last character 
        $filenameMinusLastCharacter = substr($fileWithNoExtension,0,-1); 

         /* Step 8 */ 
        //save the last character 
        $lastFilenameCharacter = substr($fileWithNoExtension,-1); 

         /* Step 9*/ 
        //if the last character is numeric add 1 
        if (is_numeric($lastFilenameCharacter)) 
        { 
         $newFilename = $path.$filenameMinusLastCharacter.($lastFilenameCharacter+1).'.'.$fileExtension; 
         //recursively call itself 

         /* Step 10*/ 
         $results = uniqueFilename($newFilename); 
         return basename($results); 
        }else{ 

         // if the last character is not numeric then add 1 
         $newFilename = $path.$fileWithNoExtension.'-1'.'.'.$fileExtension; 

          /* Step 10*/ 
         //recursively call itself 
         $results = uniqueFilename($newFilename); 
         return basename($results); 
        } 

       } 
       return basename($filepathAndFilename); 

      } 
    ?> 

    <!doctype html> 
    <html> 
    <head> 
    <meta charset="UTF-8"> 
    <title>Untitled Document</title> 
    </head> 

    <body> 

    <form method="post" enctype="multipart/form-data"/> 
    <label>Upload File</label> 
    <input type="file" name="uploadFile"/> 
    <input type="submit" name="submit" value="submit"/> 
    </form> 

    </body> 
    </html>`enter code here` 
+0

Nó luôn luôn hữu ích nếu bạn cũng giải thích Câu trả lời sẽ làm cho câu trả lời của bạn trở nên tốt hơn và có nhiều khả năng được thăng hạng. – Magnilex

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