I'm trying to send a file using Ajax in Jquery creating a FormData previously. This is my code:
var inputFileImage = document.getElementById('uploadImage');
var file = inputFileImage.files[0];
var data = new FormData();
data.append('archivo',file);
jQuery.ajax({
url: '/services/rpc.php',
type: 'post',
data: {functionName: 'saveProfileImage', data : data},
contentType:false,
processData:false,
})
.done(function(response) {
alert(response);
}.bind(this))
.fail(function(response) {
alert('Sorry, there was an unexpected error, please try again later.\n\nInformation about the error:\n'+response);
});
This ajax always goes to the fail function, and if I change the processData to true returns my another error saying Error: TypeError: 'append' called on an object that does not implement interface FormData.
Thanks for your help!
processData has to be off to send binary data. The FormData element is completely used as binary data, while data:{} needs to be processed. Additional parameters have to be appended to the formData in this case!
var data = new FormData();
data.append('archivo',file);
data.append('functionName','saveProfileImage');
jQuery.ajax({
url: '/services/rpc.php',
type: 'post',
data: data,
contentType:false,
processData:false,
});
Related
I want to upload a file using jQuery/Ajax in my Wordpress plugin. The javascript to PHP call works. So the wiring etc. works. But as soon as I post the formData, necessary to post the files, I don't reach the PHP function any more.
The javascript,
var doesntWork = new FormData();
doesntWork.append('file', 'a name');
var withthisItWorks = 'text'
var data = {
'action': 'emfi_file_upload',
'data': doesntWork
}
$.ajax({
type: "POST",
url: ajax_object.ajaxurl,
data: data,
success: function(response) {
jQuery('#emfi-message').html(`<span style="color: green;">Respons: ${response}</span>`);
}
});
The PHP function just returns a string answer:
function emfi_file_upload_callback() {
echo 'Yes, in the callback';
wp_die();
}
When I put the plain text in my data object I get answer from the PHP function. When I put the formData in, there is no answer. I've tried a lot of examples on the internet, but it boils down to this every time. Adding contentType: false and processData: false, as was mentioned somewhere else, didn't help. What's wrong?
All fields that are being sent must be in the formdata object.
Additionally for FormData to work with jQuery.ajax, processData and contentType have to be set to false.
var doesWork = new FormData();
doesWork.append('file', someFile);
doesWork.append('action', 'emfi_file_upload');
$.ajax({
type: "POST",
url: ajax_object.ajaxurl,
data: doesWork,
contentType: false,
processData: false,
success: function(response) {
jQuery('#emfi-message').html(`<span style="color: green;">Respons: ${response}</span>`);
}
});
so please take a look at the code below.
const chunk = file.slice(start,start + chunkSize + 1)
const fd = new FormData()
fd.append('data', chunk)
$.ajax({
type: 'POST',
//cache: false,
//contentType: false,
//processData: false,
url: ajax_object.ajaxurl,
data:{
action:'uploadChunk',
//chunk: fd
},
success: function(response){
console.log(response)
}
})
When I leave these comments in, the code returns with its intended response... But when I remove the comments so that I can actually send the FormData with the request, I get a 400 (bad request) error. All I'm doing on the backend for now is echoing back a string. That's it. And that works unless I try to send the formData along with it.
Any and all insight you can provide is helpful and I appreciate it greatly. Thank you~
When you're using a FormData object in ajax you pass that object alone to the ajax function. If you have to pass any other data use append.
const chunk = file.slice(start,start + chunkSize + 1)
const fd = new FormData()
fd.append('data', chunk)
fd.append('action', 'uploadChunk')
$.ajax({
type: 'POST',
//cache: false,
contentType: false,
processData: false,
url: ajax_object.ajaxurl,
data: fd,
success: function(response){
console.log(response)
}
})
pass the form data variable as data :
const chunk = file.slice(start,start + chunkSize + 1)
const fd = new FormData()
fd.append('data', chunk)
dataType: "json",
data:{
data:fd
},
I'm trying to send HTML form data using AJAX however I'm also trying to send other data along with the same AJAX POST call.
Is this possible?
$('#HTMLConForm').on('submit', function (e)
{
e.preventDefault();
$.ajax({
url: "***NewUserURL.com***",
type: "POST",
data:{
'otherinfo': otherinfo,
'form_data': new FormData(this),
},
processData: false,
contentType: false,
success: function (data)
{
alert('You Have Registered')
/*window.location = "index.html"; */
},
error: function (xhr, desc, err)
{
}
});
});
Any help with be appreciated!
Pass the FormData object itself to data, don't wrap it in a simple object.
Use the FormData object's append method to add additional data.
e.preventDefault();
const formdata = new FormData(this);
formdata.append("otherinfo", otherinfo);
$.ajax({
url: "***NewUserURL.com***",
type: "POST",
data: formdata,
I want to make an ajax call that sends both JSON and file data to my PHP backend. This is my ajax call currently:
$.ajax({
type: 'POST',
dataType: 'json',
data: jsonData,
url: 'xxx.php',
cache: false,
success: function(data) {
//removed for example
}
});
The data(jsonData) is a JSON array that also holds the input from a file select as well(I am assuming this is wrong due to the type mismatch). I tried using contentType: false, and processData: false, but when I try to access $_POST data in PHP there is nothing there. The data I am passing does not come from a form and there is quite a bit of it so I do not want to use FormData and append it to that object. I am hoping i will not have to make two ajax calls to accomplish this.
If you want to send data along with any file than you can use FormData object.
Send your jsonData as like that:
var jsonData = new FormData(document.getElementById("yourFormID"));
Than in PHP, you can check your data and file as:
<?php
print_r($_POST); // will return all data
print_r($_FILES); // will return your file
?>
Try Using formdata instead of normal serialized json
Here's an example:
var formData = new FormData();
formData.append("KEY", "VALUE");
formData.append("file", document.getElementById("fileinputID").files[0]);
then in your ajax
$.ajax({
type: 'POST',
url: "YOUR URL",
data: formData,
contentType: false,
processData: false,
dataType: 'json',
success: function (response) {
CallBack(response, ExtraData);
},
error: function () {
alert("Error Posting Data");
}
});
You can try like this also
You can visit this answer also
https://stackoverflow.com/a/35086265/2798643
HTML
<input id="fuDocument" type="file" accept="image/*" multiple="multiple" />
JS
var fd = new FormData();
var files = $("#fuDocument").get(0).files; // this is my file input in which We can select multiple files.
fd.append("kay", "value"); //As the same way you can append more fields
for (var i = 0; i < files.length; i++) {
fd.append("UploadedImage" + i, files[i]);
}
$.ajax({
type: "POST",
url: 'Url',
contentType: false,
processData: false,
data: fd,
success: function (e) {
alert("success");
}
})
I'd like to send to a PHP page a FormData value and some String values.
Here's my code on the JS side:
$.ajax({
url: 'upload-pic.php',
type: 'post',
data: {
type : type,
id : id,
formData : formData
},
processData:false,
success: function(data, status) {
//stuff i'm doing with the data
}
});
And on the PHP side :
if(isset($_POST['type']) && isset($_POST['id'])){
//stuff i'm doing
}
Then, I get an error saying that type and id are not set. I'm guessing that this comes from the processData: false from my ajax call.
But without this, I get the inevitable Illegal Invocation, coming from trying to send the FormData.
Is there any way to send the FormData AND my String values on the same call ?
Thanks!
I assume you are using the FormData object, in that case you need to append the string values to the FormData object, and pass the object in as the data parameter in jQuery's $.ajax.
You can append data to the FormData object, with the method append.
This should work:
formData.append('type', type);
fromData.append('id', id);
$.ajax({
url: 'upload-pic.php',
type: 'post',
data: formData,
processData:false,
contentType: false,
success: function(data, status) {
//stuff i'm doing with the data
}
});