html - How to get relative path of uploaded file as variable in php (repost)

842

How can I get the relative path to my uploaded file? For example if I upload test.png I would get /upload/test.png. Here is my HTML:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Jquery Ajax File Upload</title>
</head>
<body>

  <div >
    <div >
      <label>Profile image</label>
      <div >
        <span ><i ></i></span> 
        <input type="text" name="profile_image" autocomplete="off" value="" placeholder="" >
         <label >
  Browse <input type="file" name="image" onchange="myFunction()" id="image" >
</label>
<div ></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
  <script>

    $('#image').change(function(e){
      var file = this.files[0];
      var form = new FormData();
      form.append('image', file);
      $.ajax({
        url : "http://192.168.1.147/upload.php",
        type: "POST",
        cache: false,
        contentType: false,
        processData: false,
        data : form,
        success: function(response){
          $('.result').html(response.html)
        }
      });
    });

  </script>

      </div>
    </div>
  </div>

</body>
</html>

PHP:

<?php

$file = $_FILES['image'];


/* Allowed file extension */
$allowedExtensions = ["gif", "jpeg", "jpg", "png", "svg"];

$fileExtension = explode(".", $file["name"]);

/* Contains file extension */
$extension = end($fileExtension);

/* Allowed Image types */
$types = ['image/gif', 'image/png', 'image/x-png', 'image/pjpeg', 'image/jpg', 'image/jpeg','image/svg+xml'];

if(in_array(strtolower($file['type']), $types) 
    // Checking for valid image type
    && in_array(strtolower($extension), $allowedExtensions) 
    // Checking for valid file extension
    && !$file["error"] > 0)
    // Checking for errors if any
    { 
    if(move_uploaded_file($file["tmp_name"], 'uploads/'.$file['name'])){
        header('Content-Type: application/json');
        echo json_encode(['html' => /*return uploded file path and name*/ ]);    
        echo $_FILES['upload']['name'];
    }else{
        header('Content-Type: application/json');
        echo json_encode(['html' => 'Unable to move image. Is folder writable?']);    
    }
}else{    
    header('Content-Type: application/json');
    echo json_encode(['html' => 'Please upload only png, jpg images']);
}

?>

The code works, that is upload the file but I don't know how to get the path back. The path may change because its for a user profile image and later I will change the upload path to one that is /$username. If you know how get the name only please post that anyway. Thanks in advance.

656

Answer

Solution:

$file['name'] has the name of the file in it, lets saytest1.png

This is the bit of the program that saves your file in a specific location. In this case the folderuploads relative to the current working directory.

if(move_uploaded_file($file["tmp_name"], 'uploads/'.$file['name'])){
    header('Content-Type: application/json');
    echo json_encode(['html' =>  
                       /* you might want to output something like */
                          getcwd().'/uploads/'.$file['name']
                        // getcwd()    current working directory
                        // it may be that you need a relative path based on 
                        // where your application lives to generate a url, for example
                        // 'http://your_app_base_url/'.'/uploads/'.$file['name']
                     ]);    
    echo $_FILES['upload']['name']; // this will be empty unless there is a file form field with the name 'upload' 
                                   // compare with $_FILE['image'] above
}else{
    header('Content-Type: application/json');
    echo json_encode(['html' => 'Unable to move image. Is folder writable?']);    
}

If you want to move the file later, you could have a directory calledprofile_pics and move them to there, and rename to the username.

e.g.

$oldfilename = $file['name'];

//create a name for the file based on username and uploaded file extension (.jpg/.png)
$newfilename = $username.'_profile.'.pathinfo($oldfilename,PATHINFO_EXTENSION);

//this will rename /move the file from uploads to profile_pics (directory must exist already)
rename('uploads/'.$oldfilename,'profile_pics/'.$newfilename);

People are also looking for solutions to the problem: php - Zend Framework 2 - How to keep value in form fields ? on multiple record update?

Source

Didn't find the answer?

Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.

Ask a Question

Write quick answer

Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.

Similar questions

Find the answer in similar questions on our website.