-
-
Save ebidel/2410898 to your computer and use it in GitHub Desktop.
<?php | |
$fileName = $_FILES['afile']['name']; | |
$fileType = $_FILES['afile']['type']; | |
$fileContent = file_get_contents($_FILES['afile']['tmp_name']); | |
$dataUrl = 'data:' . $fileType . ';base64,' . base64_encode($fileContent); | |
$json = json_encode(array( | |
'name' => $fileName, | |
'type' => $fileType, | |
'dataUrl' => $dataUrl, | |
'username' => $_REQUEST['username'], | |
'accountnum' => $_REQUEST['accountnum'] | |
)); | |
echo $json; | |
?> |
<!DOCTYPE html> | |
<!-- | |
Copyright 2012 Google Inc. | |
Licensed under the Apache License, Version 2.0 (the "License"); | |
you may not use this file except in compliance with the License. | |
You may obtain a copy of the License at | |
http://www.apache.org/licenses/LICENSE-2.0 | |
Unless required by applicable law or agreed to in writing, software | |
distributed under the License is distributed on an "AS IS" BASIS, | |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
See the License for the specific language governing permissions and | |
limitations under the License. | |
Author: Eric Bidelman ([email protected]) | |
--> | |
<html> | |
<head> | |
<meta charset="utf-8" /> | |
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" /> | |
<title>xhr.send(FormData) Example</title> | |
</head> | |
<body> | |
<input type="file" name="afile" id="afile" accept="image/*"/> | |
<script> | |
document.querySelector('#afile').addEventListener('change', function(e) { | |
var file = this.files[0]; | |
var fd = new FormData(); | |
fd.append("afile", file); | |
// These extra params aren't necessary but show that you can include other data. | |
fd.append("username", "Groucho"); | |
fd.append("accountnum", 123456); | |
var xhr = new XMLHttpRequest(); | |
xhr.open('POST', 'handle_file_upload.php', true); | |
xhr.upload.onprogress = function(e) { | |
if (e.lengthComputable) { | |
var percentComplete = (e.loaded / e.total) * 100; | |
console.log(percentComplete + '% uploaded'); | |
} | |
}; | |
xhr.onload = function() { | |
if (this.status == 200) { | |
var resp = JSON.parse(this.response); | |
console.log('Server got:', resp); | |
var image = document.createElement('img'); | |
image.src = resp.dataUrl; | |
document.body.appendChild(image); | |
}; | |
}; | |
xhr.send(fd); | |
}, false); | |
</script> | |
<!--[if IE]> | |
<script src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js"></script> | |
<script>CFInstall.check({mode: 'overlay'});</script> | |
<![endif]--> | |
</body> | |
</html> |
Does this work in IE? I havin gissues in IE getting things to work properly with the fd FormData.
hy
"var resp = JSON.parse(this.response);"
whats wrong with this above line in IE ?
below is my code but when i post it to the java server i get nulls on parameters can some one help.
<script> Polymer('my-element', { setFiles: function(e, detail, sender) { formData = new FormData(); ``` for (var i = 0, f; f = sender.files[i]; ++i) { formData.append(sender.name, f, f.name); // alert(sender.name); formData.append("name",this.$.name.value ); // alert( f.description); formData.append("descritpion",this.$.description.value ); //alert(this.$.description.value || f.description); formData.append("title",this.$.title.value); // alert(this.$.title.value || f.title); } this.$.ajax.body = formData; // Override default type set by core-ajax. // Allow browser to set the mime multipart content type itself. this.$.ajax.contentType = null; }, upload: function(e, detail, sender) { // alert(this.$.title.value || f.title); if (!this.$.file.files.length) { alert('Please include a file'); return; } this.$.ajax.go(); }, responseChanged: function() { console.log('Response from server', this.response); }, }); ``` </script>Nicee job using FormData in JavaScript to populate $_FILES variable in php, i was wandering some days ago, why not try to populate $_FILES variable, you did it anyway !
Nice job, thank you very much (y)
Please for days now i have been looking for how to modifiy that code and get it to do a multiple upload. Please can you show how to do a multiple upload with this ?
@kressly Just include multiple files in the FormData.
and if i want to save the image in a carpet or path
{"name":null,"type":null,"dataUrl":"data:;base64,","username":null,"accountnum":null} as output
i am receiving this . can some one help to resolve my issue @chrisp22 could you find solution
You can find a working implementation of uploading file using XMLHttpRequest here.
Hi All,
Is there a way I can append the image path without using the file input
I have tried formData.append('avatar', avatar.files[0], 'cc.jpg'); any help please
Awesome, have been looking for this all day!
Thanks!
Thank you very much. Your example help me so much. I looking long time how to upload files to server via xhr. And again, thank you so much.
Thanks a lot, after looking all day long I finally found the right script!!!
Note to anyone finding this via Google and working with MVC: To use FormData, you'd have to post using xhr.setRequestHeader("Content-Type","multipart/form-data");
- not included above - but then your server-side will throw an exception if you use
if (!Request.Content.IsMimeMultipartContent() { throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); }
which is something it should never do, so I'm convinced FormData can only be used with PHP. Better to get the file into a base64 string (I have an example here: https://stackoverflow.com/questions/37134433/convert-input-file-to-byte-array/49676679#49676679 ), create a JSON object:
var dataObj = { afile: myBase64file, username: "Groucho", accountnum: 123456, };
,
add in this after the xhr.open()
:
xhr.setRequestHeader("Content-Type","application/json;charset=UTF-8");
then do xhr.send(JSON.stringify(dataObj));
at the end.
On the MVC side, you need:
[System.Web.Http.HttpPost]
public virtual ActionResult Post([FromBody]MyModel myModelObject) { ... }
You'll need to have a model:
public class MyModel {
public string afile { get; set; }
public string username { get; set; }
public int accountnum { get; set; }
}
Inside the Post, the parameters should be accessible: string file = myModelObject.afile;
Hey! you are great!! thnks !!!
Note to anyone finding this via Google Search about Cordova File Upload:
You can use this code on input:file
with position:absolute; opacity:0;
trick too. Works like a charm.
can send(fd) plus other such as image size?
Yes. You can still populate the data: {}
property as you wish.
What I said just triggers the usual use case for the plugin.
And it still works to this day!
I can access rsp.dataUrl my object all the time refuses to read into it, i have it undefined, pls help.
Thanks so much :)
I was looking for how to use $_FILES with an AJAX post and everywhere they only showed the JavaScript but not how to handle the data in PHP.