I\'m trying to use jquery and PHP to upload an image like so:
HTML
Tested and working on Goolge Chrome
, Opera
, Firefox
, Safari
.
doesn't work with IE8 or lower
Create a FormData
object and append the file
with index photo-img
and POST
it to your server with the help of XMLHttpRequest
$(function() {
$('#photo-img').change(function(){
var file = this.files[0];
// do your validation here
var formData = new FormData();
formData.append( 'photo-img', file ); // append the file to form data
var xhr = false;
if ( typeof XMLHttpRequest !== 'undefined' ) {
xhr = new XMLHttpRequest();
}
else {
var versions = [ "MSXML2.XmlHttp.5.0", "MSXML2.XmlHttp.4.0", "MSXML2.XmlHttp.3.0", "MSXML2.XmlHttp.2.0", "Microsoft.XmlHttp" ];
for( var i = 0, len = versions.length; i < len; i++ ) {
try {
xhr = new ActiveXObject( versions[i] );
break;
}
catch(e) {}
}
}
if ( xhr ) {
// replace test.php with your own upload script url
xhr.open( "POST", "test.php", true );
xhr.onreadystatechange = function() {
if ( this.readyState === 4 && this.status == 200 ) {
var response = this.response || this.responseText;
/** Do Something with the reponse **/
response = $.parseJSON( response );
if ( response && response.message ) {
window.alert( response.message );
}
}
}
// now send the formData to server
xhr.send( formData );
}
});
});
A better image upload handling on server side and return a JSON
object as response
<?php
if ( isset( $_FILES["photo-img"] ) ) {
$error = false;
$image = $_FILES["photo-img"];
$code = (int)$image["error"];
$valid = array( IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF );
$folder = dirname( __FILE__ )."/upload/"; // path to folder to where you want to move uploaded file
$target = $folder.$image["name"];
if ( !file_exists( $folder ) ) {
@mkdir( $folder, 0755, true ) ;
}
if ( $code !== UPLOAD_ERR_OK ) {
switch( $code ) {
case UPLOAD_ERR_INI_SIZE:
$error = 'Error '.$code.': The uploaded file exceeds the <a href="http://www.php.net/manual/en/ini.core.php#ini.upload-max-filesize" target="_blank" rel="nofollow"><span class="function-string">upload_max_filesize</span></a> directive in php.ini';
break;
case UPLOAD_ERR_FORM_SIZE:
$error = 'Error '.$code.': The uploaded file exceeds the <span class="const-string">MAX_FILE_SIZE</span> directive that was specified in the HTML form';
break;
case UPLOAD_ERR_PARTIAL:
$error = 'Error '.$code.': The uploaded file was only partially uploaded';
break;
case UPLOAD_ERR_NO_FILE:
$error = 'Error '.$code.': No file was uploaded';
break;
case UPLOAD_ERR_NO_TMP_DIR:
$error = 'Error '.$code.': Missing a temporary folder';
break;
case UPLOAD_ERR_CANT_WRITE:
$error = 'Error '.$code.': Failed to write file to disk';
break;
case UPLOAD_ERR_EXTENSION:
$error = 'Error '.$code.': A PHP extension stopped the file upload';
break;
default:
$error = 'Error '.$code.': Unknown upload error';
break;
}
}
else {
$iminfo = @getimagesize( $image["tmp_name"] );
if ( $iminfo && is_array( $iminfo ) ) {
if ( isset( $iminfo[2] ) && in_array( $iminfo[2], $valid ) && is_readable( $image["tmp_name"] ) ) {
if ( !move_uploaded_file( $image["tmp_name"], $target ) ) {
$error = "Error while moving uploaded file";
}
}
else {
$error = "Invalid format or image is not readable";
}
}
else {
$error = "Only image files are allowed (jpg, gif, png)";
}
}
if ( empty( $error ) ) {
echo json_encode( array( "error" => 0, "message" => "Upload success!" ) );
}
else {
echo json_encode( array( "error" => 1, "message" => $error ) );
}
exit();
}
?>
You can use $.ajax method in jquery and send the form data to a php file.
$.ajax({
type: "POST",
url: "http://localhost/index.php",
data: data,
success: success,
});
Note that $.post and $.ajax are very similar (except by default $.ajax uses type=get, you have to change it to type=post). You have more control over stuff with $.ajax, but $.post is more stream-lined -- think of $.post as a short-hand way of doing an AJAX POST. However, because $.ajax is often more structured than $.post, it is a great way for those new to AJAX to experiment with adding modifiers, such dataType:JSON
, contentType
, or even async:false
.
Ajax code would like this:
$('#photo-img').change(function(){
var file = this.files[0];
//console.log(file);
name = file.name;
size = file.size;
type = file.type;
$.ajax({
type: "POST",
url: "your_php_file.php",
data: 'f_name=' +name+ '&f_size=' +size+ '&f_type=' +type,
success: function(whatigot) {
alert('Server-side response: ' + whatigot);
} //END success fn
}); //END $.ajax
}); //END dropdown change event
Note that any data coming back from the PHP file comes into your HTML document in the success function of the AJAX call, and must be dealt with there. So that's where you insert the received data into the DOM.
For example, suppose your HTML document has a DIV with the id="myDiv"
. To insert the data from PHP into the HTML document, replace the line: alert('Server-side response: ' + whatigot);
with this:
$('#myDiv').html(whatIgot);
Your DIV now contains the data echoed from the PHP file.
On the PHP side, it basically looks like this:
<?php
$file_name = $_POST['f_name'];
$file_size = $_POST['f_size'];
$file_type = $_POST['f_type'];
//Here is where you do some stuff, such as MySQL lookups, etc
//Then build the response to send back (default is HTML, unless
//you specify something else like JSON)
$r = 'The PHP File received:<br><br>';
$r .= '
<ul>
<li>File Name: ' .$file_name.'</li>
<li>File Size: ' .$file_size.'</li>
<li>File Type: ' .$file_type.'</li>
</ul>
';
echo $r;
See this example for ideas on how it works.
Note that the above examples use jQuery, and therefore require this reference in the tags of your page:
<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
</head>