Reputation: 1216
I try send a file via jQuery to a PHP file for processing.
<form action="help-uploader.php" method="POST" class="signup" id="upform" enctype="multipart/form-data">
<input type="text" id="title" name="title" tabindex="1" value="">
<input id="file" type='file'" />
<button class="submitbtn" id="submit">submit</button>
</form>
and jQuery:
$(document).ready(function(){
$('#submit').click(function (e) {
// custom handling here
e.preventDefault();
var ititle = $("#title").val();
var ifile = $("#file").val();
$.post("help-uploader.php",
{
title: ititle,
file: ifile
},function(data, status){alert("Data: " + data + "\nStatus: " + status);});
});
});
and **help-uploader.php**
<?php
echo $_POST['file'];
echo basename($_FILES["file"]["name"]);
?>
First ECHO prints path of file in client.
Second ECHO not prints anything.
How can I send a file to PHP via jQuery correctly?
Upvotes: 4
Views: 213
Reputation: 74738
You need to take advantage of FormData()
with use of xmlhttprequest
. $.post()
should not be used while performing a file upload with ajax because it doesn't use xmlhttprequest
instead you should use $.ajax()
or native js xmlhttprequest
.
As you are using jQuery then you can do this with form submit
instead:
$(document).ready(function(){
$('#upform').submit(function(e){
e.preventDefault();
var fd = new FormData(document.querySelector(this));
$.ajax({
url: "help-uploader.php",
type: "POST",
data: fd,
cache:false, // do not cache
processData: false, // required
contentType: false // required
success:function(data){
console.log(data);
},
error:function(err){
console.log(err);
}
});
});
});
Upvotes: 1
Reputation: 1958
You need to use formdata . I am providing a example function which takes arguments ,i.e form refrence and functions callback to do stuff.This function binds event on your form submit. Try below-
function sendAjaxForm(frm,callbackbefore,callbackdone)
{
var form = frm;
form.submit(function(event){
event.preventDefault();
var formData = new FormData(this);
var ajaxReq=$.ajax({
url: $(this).attr('action'),
type: $(this).attr('method'),
data: formData,
async: false,
cache: false,
contentType: false,
processData: false,
beforeSend: callbackbefore
});
ajaxReq.done(callbackdone);
}); // submit done
}
Now call that function as in your example
sendAjaxForm($('#upform'),function(){alert('sending');},function(data){alert("Data: " + data);})
Upvotes: 3