简体   繁体   中英

How do I set relative paths in PHP?

I have an absolute path of (verified working)

  $target_path = "F:/xampplite/htdocs/host_name/p/$email.$ext";

for use in

move_uploaded_file($_FILES['ufile']['tmp_name'], $target_path

However when I move to a production server I need a relative path:

If /archemarks is at the root directory of your server, then this is the correct path. However, it is often better to do something like this:

$new_path = dirname(__FILE__) . "/../images/" . $new_image_name;

This takes the directory in which the current file is running, and saves the image into a directory called images that is at the same level as it.

In the above case, the currently running file might be:

/var/www/archemarks/include/upload.php

The image directory is:

/var/www/archemarks/images

For example, if /images was two directory levels higher than the current file is running in, use

$new_path = dirname(__FILE__) . "/../../images/" . $new_image_name;
$target_path = __DIR__ . "/archemarks/p/$email.$ext";
$target_path = "archemarks/p/$email.$ext";

notice the first "/"

/ => absolute, like /home

no "/" => relative to current folder

That is an absolute path. Relative paths do not begin with a / .

If this is the correct path for you on the production server, then PHP may be running in a chroot . This is a server configuration issue.

Below is code for a php file uploader I wrote with a relative path. Hope it helps. In this case, the upload folder is in the same dir as my php file. you can go up a few levels and into a different dir using ../

<?php
if(function_exists("date_default_timezone_set") and function_exists("date_default_timezone_get"))
@date_default_timezone_set('America/Anchorage');
ob_start();
session_start();

// Where the file is going to be placed 
$target_path = "uploads/" . date("Y/m/d") . "/" . session_id() . "/";
if(!file_exists( $target_path )){
    if (!mkdir($target_path, 0755, true))
        die("FAIL: Failed to create folders for upload.");
}

$maxFileSize = 1048576*3.5; /* in bytes */ 

/* Add the original filename to our target path.  
Result is "uploads/filename.extension" */
$index = 0;
$successFiles = array();
$failFiles = null;
$forceSend = false;
if($_SESSION["security_code"]!==$_POST["captcha"]){
    echo "captcha check failed, go back and try again";
    return;
}

foreach($_FILES['attached']['name'] as $k => $name) {
    if($name != null && !empty($name)){
        if($_FILES['attached']['size'][$index] < $maxFileSize ) {
            $tmp_target_path = $target_path . basename( $name );
            if(move_uploaded_file($_FILES['attached']['tmp_name'][$index], $tmp_target_path)) {
                $successFiles[] = array("file" => $tmp_target_path);
            } else{
                if($failFiles == null){
                    $failFiles = array();
                }
                $failFiles[] = array ("file" => basename( $name ), "reason" => "unable to copy the file on the server");
            }
        } else {
            if($failFiles == null){
                    $failFiles = array();
                }
                $failFiles[] = array ("file" => basename( $name ), "reason" => "file size was greater than 3.5 MB");
        }
        $index++;
    }   
}

?>

<?php 
    $response = "OK";
    if($failFiles != null){ 
        $response = "FAIL:" . "File upload failed for <br/>";
        foreach($failFiles as $k => $val) {
            $response .= "<b>" . $val['file'] . "</b> because " . $val['reason'] . "<br/>";
        }
    }

?>
<script language="javascript" type="text/javascript">
   window.top.window.uploadComplete("<?php echo $response; ?>");
</script>  

Assuming the /archemarks directory is directly below document root - and your example suggests that it is -, you could make the code independent of a specific OS or environment. Try using

$target_path = $_SERVER['DOCUMENT_ROOT'] . "/archemarks/p/$email.$ext";

as a generic path to your target location. Should work fine. This notation is also independent of the location of your script, or the current working directory.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM