-
Star
(138)
You must be signed in to star a gist -
Fork
(44)
You must be signed in to fork a gist
-
-
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> |
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.
Awesome, have been looking for this all day!
Thanks!