Welcome to a tutorial on how to AJAX upload an image in PHP. The Stone Age of the Internet is long over, and gone are the days when we have to reload the entire page to upload a file. Let us walk through simple examples of using AJAX to upload images in this guide – Read on!
TABLE OF CONTENTS
DOWNLOAD & NOTES
Here is the download link to the example code, so you don’t have to copy-paste everything.
EXAMPLE CODE DOWNLOAD
Just click on “download zip” or do a git clone. I have released it under the MIT license, so feel free to build on top of it or use it in your own project.
SORRY FOR THE ADS...
But someone has to pay the bills, and sponsors are paying for it. I insist on not turning Code Boxx into a "paid scripts" business, and I don't "block people with Adblock". Every little bit of support helps.
Buy Me A Coffee Code Boxx eBooks
PHP AJAX IMAGE UPLOAD
All right, let us now get into the examples of uploading images with AJAX.
TUTORIAL VIDEO
EXAMPLE 1) SINGLE IMAGE UPLOAD
1A) THE HTML
<form id="upForm" onsubmit="return up();">
<input type="file" accept="image/*" name="upFile" required>
<input type="submit" value="Upload">
</form>
No nasty surprises here, this is just a regular Joe HTML <form>
with a single <input type="file">
field. Just take note that we are using Javascript up()
to handle the file upload.
1B) THE JAVASCRIPT
function up () {
// (A) GET SELECTED IMAGE
var data = new FormData(document.getElementById("upForm"));
// (B) AJAX UPLOAD
fetch("1c-upload.php", { method:"POST", body:data })
.then(res => res.text())
.then(txt => alert(txt))
.catch(err => console.error(err));
return false;
};
Yep. That’s all the “confusing code” to do an AJAX upload.
var data = new FormData(HTML FORM)
Get the selected file from the HTML form.fetch("1c-upload.php", { method:"POST", body:data })
Uploads the selected file to the server.- Lastly,
return false
to prevent the default form submission and reloading of the page.
P.S. If you do not know fetch()
and arrow functions var FUNCTION = () => {}
, I will leave some links and a quick crash course in the extras section below.
1C) PHP UPLOAD HANDLER
<?php
$src = $_FILES["upFile"]["tmp_name"];
$dst = $_FILES["upFile"]["name"];
echo move_uploaded_file($src, $dst) ? "OK" : "ERROR" ;
Finally in PHP, we just move the uploaded file out of the temporary folder. The end.
EXAMPLE 2) MULTIPLE IMAGES UPLOAD
2A) THE HTML
<!-- (A) UPLOAD FORM -->
<form id="upForm" onsubmit="return up.add();">
<input type="file" accept="image/*" id="upFile" required multiple>
<input type="submit" value="Upload" id="upGo" disabled>
</form>
<!-- (B) UPLOAD STATUS -->
<div id="upStat"></div>
How about uploading multiple files at once? This is pretty much the same HTML form, except for:
<input type="file" multiple>
File field now accepts multiple files.<div id="upStat">
An empty container to show the upload status.
2B) THE JAVASCRIPT
var up = {
// (A) INIT
upForm : null, // html form
upFile : null, // html file selector
upGo : null, // html submit button
upStat : null, // html status display
queue : [], // upload queue
init : () => {
up.upForm = document.getElementById("upForm");
up.upFile = document.getElementById("upFile");
up.upGo = document.getElementById("upGo");
up.upStat = document.getElementById("upStat");
up.upGo.disabled = false;
},
// (B) ADD TO UPLOAD QUEUE
add : () => {
// (B1) DISABLE SUBMIT BUTTON
up.upGo.disabled = true;
// (B2) GET FILES + RESET FIELD
for (let f of up.upFile.files) { up.queue.push(f); }
up.upForm.reset();
// (B3) AJAX UPLOAD
up.ajax();
return false;
},
// (C) AJAX UPLOAD
ajax : () => {
// (C1) APPEND FIRST FILE IN QUEUE
var data = new FormData();
data.append("upFile", up.queue[0]);
// (C2) UPLOAD
fetch("2c-upload.php", { method:"POST", body:data })
.then(res => res.text())
.then(txt => {
// (C2-1) SHOW UPLOAD STATUS
up.upStat.innerHTML += `<div>${up.queue[0].name} - ${txt}</div>`;
// (C2-2) NEXT FILE
up.queue.shift();
if (up.queue.length!=0) { up.ajax(); }
else { up.upGo.disabled = false; }
})
.catch(err => {
// (C2-3) ERROR!
up.upStat.innerHTML += `<div>${err.message}</div>`;
console.error(err);
});
}
};
window.onload = up.init;
This will probably scare beginners away, but keep calm and look closely.
- On window load,
up.init()
will run. All it does – Get HTML elements. - When the form is submitted,
up.add()
will run. What it does – Put the selected files intoup.queue
array and start the ajax upload. up.ajax()
Captain Obvious, upload the first file in the queue.
In short, the reason why we are doing this is – AJAX is asynchronous. To prevent a flood of 9999 concurrent uploads all at once, we create a queue to upload one by one instead.
2C) PHP UPLOAD HANDLER
<?php
$src = $_FILES["upFile"]["tmp_name"];
$dst = $_FILES["upFile"]["name"];
echo move_uploaded_file($src, $dst) ? "OK" : "ERROR" ;
See any difference here? Hint: There’s none.
EXTRAS
That’s all for this project, and here is a small section on some extras that may be useful to you.
CRASH COURSE – ARROW FUNCTIONS
// (A) YOU ALREADY KNOW THIS
function twice (a) { return a * 2; }
// (B) WE CAN ALSO DO THIS
var twice = function (a) { return a * 2; };
// (C) IN MODERN JS, WE "SHORTHAND" IT TO AN ARROW FUNCTION
var twice = (a) => { return a * 2; };
// (D) IF THERE IS ONLY 1 PARAMETER & RETURN, WE CAN FURTHER SHORTEN IT
var twice = a => { return a * 2; };
var twice = a => a * 2;
RESTRICTING THE IMAGE SIZE & TYPE
Yes, we can set accept="EXTENSIONS"
in the HTML. But take note that any code ninja can use the developer’s console to change the HTML and bypass the checks. It is best to also implement your file size/type restrictions in PHP. See the links below.
COMPATIBILITY CHECKS
- Fetch – CanIUse
- Arrow Functions – CanIUse
- Form Data – CanIUse
The examples will work on all modern browsers.
LINKS & REFERENCES
- Fetch API – MDN
- FormData API – MDN
- Drag-and-drop file upload – Code Boxx
- Save the image file into the database – Code Boxx
- AJAX Upload With Progress Bar – Code Boxx
- Restrict Upload File Type – Code Boxx
- Restrict Upload File Size – Code Boxx
- Very Simple AJAX Examples With PHP (Fetch) – Code Boxx
THE END
Thank you for reading, and we have come to the end of this guide. I hope that it has helped you with your project, and if you want to share anything with this guide, please feel free to comment below. Good luck and happy coding!
Great Script
I think helpful would be if you include a file-size limiter to avoid uploading huge images… as most people who will use your script… have NO Clue how to add it… 🙂
Maybe I overlooked it but I didn’t see were it checks IF File already exits ?!
I use this…
// Check if exists
if (file_exists($target_file)) {
echo “Ops…We GOT this File already!.”;
$uploadOk = 0;
}
// Check size
if ($_FILES[“fileToUpload”][“size”] > 7250000) {
echo “Ouch!!!Your File-Size is too large.”;
$uploadOk = 0;
}
https://code-boxx.com/restrict-file-type-size-php-upload/