Tuesday, June 4, 2024
 Popular · Latest · Hot · Upcoming
23
rated 0 times [  26] [ 3]  / answers: 1 / hits: 86454  / 10 Years ago, tue, april 22, 2014, 12:00:00

I have upload form that allows users to upload multiple files. I decided that a progress bar would be good if the files are quite large. Below is my source code. I am new to jquery normally I would just php but I find that ajax is more user friendly.



<div id=new_upload>
<div class=close_btn></div>
<div id=uploads></div>
<form action=global.func/file_upload.php method=post enctype=multipart/form-data id=upload_file>
<fieldset><legend>Upload an image or video</legend>
<input type=file id=file name=file[] placeholder=Upload Image or Video multiple /><input type=submit value=upload file id=upload_file_btn required />
</fieldset>

<div class=bar>
<div class=bar_fill id=pb>
<div class=bar_fill_text id=pt></div>
</div>
</div>

</form>
</div>
<script>
function OnProgress(event, position, total, percentComplete){
//Progress bar
console.log(total);
$('#pb').width(percentComplete + '%') //update progressbar percent complete
$('#pt').html(percentComplete + '%'); //update status text
}
function beforeSubmit(){
console.log('ajax start');
}
function afterSuccess(data){
console.log(data);
}
$(document).ready(function(e) {
$('#upload_file').submit(function(event){
event.preventDefault();
var filedata = document.getElementById(file);
formdata = new FormData();
var i = 0, len = filedata.files.length, file;
for (i; i < len; i++) {
file = filedata.files[i];
formdata.append(file[], file);
}
formdata.append(json,true);
$.ajax({
url: global.func/file_upload.php,
type: POST,
data: formdata,
processData: false,
contentType: false,
dataType:JSON,
xhr: function() {
var myXhr = $.ajaxSettings.xhr();
return myXhr;
},
beforeSubmit: beforeSubmit,
uploadProgress:OnProgress,
success: afterSuccess,
resetForm: true
});
});
});
</script>


The image upload works fine, the array send to ajax but the progress bar doesn't move. In fact the console.log for the two functions called need to produce this don't appear either. Is there a correct way to call the functions in my ajax request that would get this progress bar to work.




beforeSubmit: beforeSubmit,
uploadProgress:OnProgress,
success: afterSuccess,




NOTE that this function 'success: afterSuccess' is working as the console is displaying my data.


More From » jquery

 Answers
5

This is your HTML form



<form method=post action=uploadImages.php name ='photo' id='imageuploadform' enctype=multipart/form-data>
<input hidden=true id=fileupload type=file name=image[] multiple >

<div id =divleft>
<button id=btnupload></button>

</div>

</form>


This is your JQuery and ajax.
By default the fileInput is hidden.



Upload Button clicked



$(#btnupload).click(function(e) {

$(#fileupload).click();
e.preventDefault();

});


$('#fileupload').change(function (e) {

$(#imageuploadform).submit();
e.preventDefault();

});

$('#imageuploadform').submit(function(e) {

var formData = new FormData(this);

$.ajax({
type:'POST',
url: 'ajax/uploadImages',
data:formData,
xhr: function() {
var myXhr = $.ajaxSettings.xhr();
if(myXhr.upload){
myXhr.upload.addEventListener('progress',progress, false);
}
return myXhr;
},
cache:false,
contentType: false,
processData: false,

success:function(data){
console.log(data);

alert('data returned successfully');

},

error: function(data){
console.log(data);
}
});

e.preventDefault();

});


function progress(e){

if(e.lengthComputable){
var max = e.total;
var current = e.loaded;

var Percentage = (current * 100)/max;
console.log(Percentage);


if(Percentage >= 100)
{
// process completed
}
}
}


Your php code looks like this



<?php

header('Content-Type: application/json');

$valid_exts = array('jpeg', 'jpg', 'png', 'gif'); // valid extensions
$max_size = 30000 * 1024; // max file size in bytes

$json = array();

if ( $_SERVER['REQUEST_METHOD'] === 'POST' )
{
for($i=0;$i<count($_FILES['image']['tmp_name']);$i++)
{
$path=image/uploads/photos/;

if(is_uploaded_file($_FILES['image']['tmp_name'][$i]) )
{
// get uploaded file extension
$ext = strtolower(pathinfo($_FILES['image']['name'][$i], PATHINFO_EXTENSION));
// looking for format and size validity
if (in_array($ext, $valid_exts) AND $_FILES['image']['size'][$i] < $max_size)
{
// unique file path
$uid = uniqid();
$date = date('Y-m-d-H-i-s');
$path = $path .image_ .$date. '_' . $uid . . .$ext;

$returnJson[]= array(filepath=>$path);

$filename = image_ . $date . _ .$uid . . . $ext;
$this->createthumb($i,$filename);

// move uploaded file from temp to uploads directory
if (move_uploaded_file($_FILES['image']['tmp_name'][$i], $path))
{
//$status = 'Image successfully uploaded!';
//perform sql updates here

}
else {
$status = 'Upload Fail: Unknown error occurred!';
}


}
else {
$status = 'Upload Fail: Unsupported file format or It is too large to upload!';
}
}
else {
$status = 'Upload Fail: File not uploaded!';
}
}
}
else {
$status = 'Bad request!';
}


echo json_encode($json);

?>

[#71351] Sunday, April 20, 2014, 10 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
nolancampbellc

Total Points: 9
Total Questions: 102
Total Answers: 101

Location: Saint Vincent and the Grenadines
Member since Mon, Jan 16, 2023
1 Year ago
nolancampbellc questions
Thu, Sep 23, 21, 00:00, 3 Years ago
Mon, Nov 23, 20, 00:00, 4 Years ago
;