J'utilise Krajee, le plug-in Bootstrap File Input, pour effectuer un téléchargement via un appel AJAX.
Voici le lien vers la section du plugin Krajee AJAX: Le plugin Krajee AJAX
Les codes JS et PHP (codeigniter) que j'utilise sont les suivants:
JS:
<script>
$("#file-upload").fileinput({
'allowedFileExtensions' : ['csv'],
'maxFileSize': 5120,
'maxFileCount': 1,
'uploadUrl': 'dashboard/uploader',
'elErrorContainer': '#errorBlock',
'uploadAsync': true,
'msgInvalidFileExtension': 'Invalid extension for file "{name}". Only "{extensions}" files are supported.',
'uploadExtraData': {csrf_token_name: $("input[name=csrf_token_name]").val()}
});
</script>
PHP:
public function uploader(){
$config['upload_path'] = './csv_uploads/';
$config['allowed_types'] = 'csv';
$config['max_size'] = '5120';
$this->upload->initialize($config);
if (!$this->upload->do_upload("file-upload")){
$data['error'] = 'The following error occured : '.$this->upload->display_errors().'Click on "Remove" and try again!';
echo json_encode($data);
} else {
echo json_encode("success");
}
}
À l’heure actuelle, j’obtiens une réponse de PHP qui que ce soit d’une erreur ou d’un succès en tant que JSON, j’ai parcouru la documentation du plugin et je ne trouve toujours pas comment attraper la réponse AJAX et agir conformément à cette réponse comme dans jQuery avec la fonction de succès ajax:
success: function (response) {
//Deal with the server side "response" data.
},
Comment puis-je faire ceci?
Vous pouvez consulter une démo ici démo en direct
N'oubliez pas de définir uploadAsync false si vous souhaitez que l'événement de réussite soit déclenché.
Exemple de code:
JS
$("#input-id").fileinput({
showRemove:false,
showPreview: false,
uploadUrl: "../xxxx/xxxx/XXXXXX.php", // server upload action
uploadAsync: false,
uploadExtraData: function() {
return {
bdInteli: xxxx
};
}
});
// CATCH RESPONSE
$('#input-id').on('filebatchuploaderror', function(event, data, previewId, index) {
var form = data.form, files = data.files, extra = data.extra,
response = data.response, reader = data.reader;
});
$('#input-id').on('filebatchuploadsuccess', function(event, data, previewId, index) {
var form = data.form, files = data.files, extra = data.extra,
response = data.response, reader = data.reader;
alert (extra.bdInteli + " " + response.uploaded);
});
PHP
$nombre = $_FILES["ficheroExcel"]["name"];
$bdInteli = $_POST['bdInteli'];
if (move_uploaded_file($_FILES["ficheroExcel"]["tmp_name"], $nombre) ){
$output = array('uploaded' => 'OK' );
} else {
$output = array('uploaded' => 'ERROR' );
}
echo json_encode($output);
Vous pouvez lire la section events sur la page de documentation du plugin pour comprendre les différents événements fournis par le plugin.
Cela dépend de la manière dont vous avez configuré le téléchargement ajax dans le plugin. Le plugin offre deux modes de téléchargement ajax - synchrone et asynchrone comme décrit dans la documentation. Son asynchrone si la propriété uploadAsync
est définie sur true
.
POUR AJAX PIÈGE À SUCCÈS:
POUR AJAX ERREUR PIÈGE:
Dans votre cas, vous avez défini uploadAsync
sur true - utilisez donc les paramètres/événements asynchrones.
vous pouvez utiliser cet exemple de code dans votre test. Dans mon test, mes données de réponse ressemblent à ceci:
response data:
{
"ver":"1.0",
"ret":true,
"errmsg":null,
"errcode":0,
"data":{
"status":"upload success",
"originalFilename":"testFileName.txt",
"fileName":"excelFile",
"fileType":"text/plain",
"fileSize":1733
}
javascript code:
$('#input-id').on('fileuploaded', function(event, data, previewId, index) {
var response = data.response;
if(response.ret ) {
alert("upload success!"+data.response.data);
}else{
alert("upload failed!"+response.errmsg)
}
alert('File uploaded triggered'+form+"response:"+response);
console.info(response.data);
});
référez-vous cette réponse , j'ai fait comme ça
javascript:
$('#input-id').on('fileuploaded', function(event, data, previewId, index) {
var form = data.form, files = data.files, extra = data.extra,
response = data.response, reader = data.reader;
console.log('File uploaded successfully : ID '+ data.response.d);
});
Dans ASHX Fichier, ajoutez une réponse au contexte:
context.Response.ContentType = "application/json";
string myId = "NewwId 1";
var wrapper = new { d = myId };
context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(wrapper));