在使用php上传之前,如何重命名文件名

I need to upload two files with different ext example :

file_1.txt and file_image.png

when the user sent the two files using upload an form :

file_1.txt and file_image.png

before move_uploaded_file I need to rename the image name to be like the txt. name file :

file_1.txt file_1.jpeg

I just want to rename the image filename, not the extension

Code is something like this :

switch($_REQUEST['action']) {

    case "upload":

        $Imagefile_temp = $_FILES['file']['tmp_name'];
        $Textfile_temp = $_FILES['file']['tmp_name'];

        $Imagefile_name = $_FILES['file']['name'];
        $Textfile_name = $_FILES['file']['name'];

        $ImageFileType =  array('png' ,'jpg');
        $TextFileType =  array('txt');



        $Image_extension = pathinfo($Imagefile_name, PATHINFO_EXTENSION);   // holds the file extension of the file
        $Text_extension = pathinfo($Textfile_name, PATHINFO_EXTENSION);   //holds the file extension of the file



        // //Declaring Path for uploaded images 
        $file_path = "uploads";

        //checks for duplicate files
        if((!file_exists($file_path."/".$Imagefile_name)) || (!file_exists($file_path."/".$Textfile_name))) {

            $j = 0; //Variable for indexing uploaded image 

            for ($i = 0; $i < count($_FILES['file']['name']); $i++) {//loop to get individual element from the array

                if(in_array($Image_extension,$ImageFileType) ) {

                    $Image_extension = explode('.', basename($_FILES['file']['name'][$i]));//explode file name from dot(.) 
                    $file_extension = end($Image_extension); //store extensions in the variable
                    $target_path = $target_path . md5(uniqid()) . "." . $Image_extension[count($Image_extension) - 1];//set the target path with a new name of image

                    $j = $j + 1;//increment the number of uploaded images according to the files in array   

                    $Imagefilestatus = move_uploaded_file($Imagefile_temp,$file_path."/"."image_".$Imagefile_name) ;//if file moved to uploads folder

                } 


                if(in_array($Text_extension,$TextFileType) ) {

                    $Text_extension = explode('.', basename($_FILES['file']['name'][$i]));//explode file name from dot(.) 

                    $file_extension = end($Text_extension); //store extensions in the variable

                    $target_path = $target_path . md5(uniqid()) . "." . $Text_extension[count($Text_extension) - 1];//set the target path with a new name of image

                    $j = $j + 1;//increment the number of uploaded images according to the files in array       

                    $Textfilestatus = move_uploaded_file($Textfile_temp,$file_path."/".$Textfile_name) ;//if file moved to uploads folder

                } 
            }
        }   
    }       

You can just explode the text file from the extension and use it as the image file name when moving it :

$text_file_name = $_FILES["text"]["name"]; // give you the text file name
$image_file_name = $_FILES["image"]["name"]; // give you the image file name
$file_expensions = strtolower(end(explode(".", $image_file_name))); // give you the image extension and so you can use it later for saving the file
$n = explode(".", $text_file_name, 1); 
$name = $n[0]; // get text file name
$name = $name.".".$file_expensions; // this is new name of the image

move_uploaded_file($file_tmp, "path/$name")
$name = 'Whatevernameyouwant.'.pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);

pathinfo with parameter PATHINFO_EXTENSION returns the file extension.

I assume you are aware that the code you've presented here allows anyone with upload privileges to upload and execute PHP code.

(the reason I mention this is that there is scope for a lot of improvement elsewhere - and if the security vulnerability is exploitable then you should really think about start again from scratch with this).

Will your extension always be .jpg or .png ? (what about .jpeg ?)

I need to rename the image name to be like the txt. name file

I presume you mean that you want the filename on the retained image file to match that of the txt file - you can specify the destination name in move_uploaded_file(). Breaking down a process into steps is a good idea for managing complexity but file operations are expensive and here redundant.

So really you want to know how to get the a filename without an extension then add the file extension from a different file.

You already have the extension you want to apply in $Image_extension

While you could just do....

$destination_name=$destination_path 
   . str_replace('.txt', '.' . $image_extension, $Textfile_name);

However this will not work as expected if $imageFile_name contains more than one instance of '.txt'.

You could use PCREs to specify that you should only apply the change to the end of the string:

$destination_name=preg_replace("/txt$/i", $image_extension, $Textfile_name);

Or take the last 4 characters off $Textfile_name then append the image extension.

$destination_name=substr($Textfile_name, 0, -3) . $image_extension;

Or strrev the text file name, replace 'txt' with strrev($image_extension) with a limit of 1, then strrev the result to ensure only the end of the string is replaced.

If I spent more time thinking about this, there are probably other solutions too - but they will become increasingly esoteric.

In general, allowing users to pick their own names (or even part thereof) for content uploaded inside the document root is a bad idea.