Je souhaite télécharger une image sur le serveur lors d'un événement jQuery mais en utilisant codeigniter csrf, je ne peux télécharger une image qu'une seule fois. Comment puis-je télécharger des images en utilisant ajax pour plusieurs requêtes.S'il vous plaît garder à l'esprit lorsque je configure cette
config['csrf_protection'] = FALSE;
je peux alors envoyer plusieurs requêtes à un événement jQuery onchange mais lorsque csrf_protection est fausse, je pense que csrf ne présente aucun avantage. la question est donc de savoir comment puis-je envoyer plusieurs requêtes en utilisant ajax lorsque csrf_protection est activé. Mon code jQuery suit
$("#avatar").change(function(){
var link = $("#avatar").val();
$.ajax({
url : "<?php echo base_url('main/test'); ?>",
type: 'post',
data: {'<?php echo $this->security->get_csrf_token_name(); ?>':'<?php echo $this->security->get_csrf_hash(); ?>',"id":"hello","link":link},
success : function(data)
{
alert(data);
}
});
});
A mon avis, vous devriez essayer de recréer votre jeton CSRF à chaque demande.
Essayez cet exemple de code ...
Pour le funcion js
var csrfName = '<?php echo $this->security->get_csrf_token_name(); ?>',
csrfHash = '<?php echo $this->security->get_csrf_hash(); ?>';
("#avatar").change(function(){
var link = $("#avatar").val();
$.ajax({
url : "<?php echo base_url('main/test'); ?>",
type: 'post',
data: {csrfName:csrfHash,"id":"hello","link":link},
success : function(data)
{
csrfName = data.csrfName;
csrfHash = data.csrfHash;
alert(data.message);
}
});
});
et pour le contrôleur
public function test() {
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = 500;
$config['max_width'] = 260;
$config['max_height'] = 260;
$reponse = array(
'csrfName' => $this->security->get_csrf_token_name(),
'csrfHash' => $this->security->get_csrf_hash()
)
$this->load->library('upload', $config);
if (!$this->upload->do_upload('link')) {
$reponse['message'] = "error";
}
else {
$data = array('upload_data' => $this->upload->data());
$image_name = $data['upload_data']['file_name'];
$reponse['message'] = $image_name;
}
echo json_encode($reponse);
}
Faites le moi savoir et bonne chance
Remarque: Lorsque quelqu'un vous demande de poster plus de données dans la question, ne le postez pas sous forme de commentaire ou de réponse, il est préférable de modifier la question elle-même et d'ajouter le contenu
Vous pouvez définir ceci dans config.php
$config['csrf_regenerate'] = FALSE;
la protection csrf est donc valide pendant tout le temps de session, elle résoudra votre problème . Si vous définissez $config['csrf_regenerate'] = true;
, alors CI générera un nouveau jeton csrf à chaque demande afin que votre ancien jeton csrf ne corresponde pas au nouveau
Il vous suffit de recharger le jeton CSRF dans notre réponse AJAX. C'est si simple!
ajoutez ceci à un fichier js qui est chargé à chaque page (je le mets à la fin de jquery.js)
$.ajaxSetup({
beforeSend:function(jqXHR, Obj){
var value = "; " + document.cookie;
var parts = value.split("; csrf_cookie_name=");
if(parts.length == 2)
Obj.data += '&csrf_token='+parts.pop().split(";").shift();
}
});
(notez que dans chaque requête ajax, vous ne pouvez pas envoyer de données vides)
"csrf_cookie_name" en haut défini dans config.php
$config['csrf_cookie_name'] = 'csrf_cookie_name';
S'il vous plaît essayez comme mon code. ça marche mon application
votre fichier de vue
$token_name = $this->security->get_csrf_token_name();
$token_hash = $this->security->get_csrf_hash();
<input type="text" id="search-text" name="parent_name" placeholder="Search" value="" >
<input type="hidden" id="csrf" name="<?php echo $token_name; ?>" value="<?php echo $token_hash; ?>" />
après la méthode post jquery post comme ci-dessous
// Get Keyup
jQuery( "#search-text").keyup(function() {
// Get Data
var val = jQuery("#search-text").val();
var hashValue = jQuery('#csrf').val();
// Get jquery post for ajax task
jQuery.post(
'<?php echo $base_controler; ?>',
{val:val,'<?php echo $this->security->get_csrf_token_name(); ?>':hashValue},
function(data)
{
// Get return data to decode
var obj = jQuery.parseJSON(data);
// Get csrf new hash value
var new_hash = obj.csrfHash;
// Set csrf new hash value update
jQuery('#csrf').val(new_hash);
}
);
});
veuillez régler votre contrôleur comme ci-dessous
$reponse = array(
'csrfName' => $this->security->get_csrf_token_name(),
'csrfHash' => $this->security->get_csrf_hash()
);
echo json_encode($reponse);
par-dessus tout, le code recrée chaque jeton csrf.