Limiter le nombre d'upload

Eléphant du PHP | 233 Messages

01 déc. 2018, 19:50

Bonsoir à tous,

je cherche à limiter le nombre d'image après l'upload. J'utilise un script java pour charger les images et les voir au fur et à mesure. Une fois 5 images uploader, je voudrais afficher une message avec java "nombre d'image maxi atteint" pas exemple.

Je limite l'upload avec PHP, je vous met les scripts que j'utilise ça sera mieux pour comprendre.
<div class="form-group">
  
    <input type="file" name="multiple_files" id="multiple_files"  class="file" multiple />
    <span class="text-muted">Uniquement au format .jpg, png, .gif et poids maximum 2 Mo</span>
	<div class="input-group col-xs-12">
      <span class="input-group-addon"><i class="glyphicon glyphicon-picture"></i></span>
      <input type="text" class="form-control input-lg" disabled placeholder="Charger une image">
      <span class="input-group-btn">
        <button class="browse btn btn-primary input-lg" type="button"><i class="glyphicon glyphicon-search"></i> Choisir une image</button>
      </span>
    </div>
    <span id="error_multiple_files"></span>
 
     <br />
   <div class="row" id="image_table">
    
   </div>
  </div>
Le code java que j'utilise dans le fichier html
  var error_images = '';
  var form_data = new FormData();
  var files = $('#multiple_files')[0].files;
  if(files.length > 3)
  {
   error_images += 'Vous ne pouvez pas t&eacute;l&eacute;charger plus de 3 images';
  }
  else
  {
   for(var i=0; i<files.length; i++)
   {
    var name = document.getElementById("multiple_files").files[i].name;
    var ext = name.split('.').pop().toLowerCase();
    if(jQuery.inArray(ext, ['gif','png','jpg','jpeg']) == -1) 
    {
     error_images += '<p>Fichier invalide !</p>';
    }
    var oFReader = new FileReader();
    oFReader.readAsDataURL(document.getElementById("multiple_files").files[i]);
    var f = document.getElementById("multiple_files").files[i];
    var fsize = f.size||f.fileSize;
    if(fsize > 200000)
    {
     error_images += '<p>L\'image est trop grosse</p>';
    }
    else
    {
     form_data.append("file[]", document.getElementById('multiple_files').files[i]);
    }
   }
  }
  if(error_images == '')
  {
   $.ajax({
    url:"upload.php",
    method:"POST",
    data: form_data,
    contentType: false,
    cache: false,
    processData: false,
    beforeSend:function(){
     $('#error_multiple_files').html('<br /><label class="text-primary"><img src="img/ajax-loader.gif" /> T&eacute;l&eacute;chargement en cours...</label>');
       
    },   
    success:function(data)
    {
     $('#error_multiple_files').html('<br /><label class="text-success">T&eacute;l&eacute;chargement termin&eacute;</label>');
     load_image_data();
    }
	
   });
  }
  else
  {
   $('#multiple_files').val('');
   $('#error_multiple_files').html("<span class='text-danger'>"+error_images+"</span>");
   return false;
  }
 
et le code PHP pour limiter et uploader les images
<?php session_start();
//upload.php
include('config.inc.php');


 if(count($_FILES["file"]["name"]) > 0)
{
 //$output = '';
 sleep(3);
 

 
 for($count=0; $count<count($_FILES["file"]["name"]); $count++)
 {
  $file_name = $_FILES["file"]["name"][$count];
  $tmp_name = $_FILES["file"]['tmp_name'][$count];
  $file_array = explode(".", $file_name);
  $file_extension = end($file_array);
  if(file_already_uploaded($file_name, $bdd))
  {
   $file_name = $file_array[0] . '-'. rand() . '.' . $file_extension;
  }
 	if(file_count($count, $bdd))
	{
   $location = 'img/' . $file_name;
  
  if(move_uploaded_file($tmp_name, $location))
  {
  $query = "
   INSERT INTO tbl_image (image_name, id_membre, image_description) 
   VALUES ('".$file_name."', '".$_SESSION['id']."', '')
   ";
   $statement = $bdd->prepare($query);
   $statement->execute();
   }
 }
	}
	
	}


function file_already_uploaded($file_name, $bdd)
{
 
 $query = "SELECT * FROM tbl_image WHERE image_name = '".$file_name."'";
 $statement = $bdd->prepare($query);
 $statement->execute();
 $number_of_rows = $statement->rowCount();
 if($number_of_rows > 0)
 {
  return true;
 }
 else
 {
  return false;
 }
}

function file_count($count, $bdd)
{

 $query = "SELECT * FROM tbl_image WHERE id_membre = '".$_SESSION['id']."'";
 $nb = $bdd->prepare($query);
 $nb->execute();
 $nb_of_rows = $nb->rowCount();
 if($nb_of_rows < 5)
 {
 return true;
 }
 else
 {
 return false; 
 }
 }

?>
Merci de votre aide...

Mammouth du PHP | 856 Messages

06 déc. 2018, 16:47

Est-ce que ton code - tel qu'il est présenté ci-haut - fonctionne ?
( J'entends, à l'exception de la vérification files.length > 3)

As-tu vérifié la valeur de files.length ?
Pour ce faire, il te suffit d'un alert("Voici la valeur évaluée : " + files.length) ;

Si tes usagers sont préalablement avisés des limites, tu peux réduire ton nombre d'occurrence de traitement.
En lieu et place de
for(var i=0; i<files.length; i++)

Tu y mettrais alors une valeur en dur, conforme à ta limite
for(var i=0; i<3; i++)
Soyez artisans de paix

Eléphant du PHP | 233 Messages

15 déc. 2018, 16:30

Bonjour,
oui tout fonctionne bien
J'ai modifié selon ta proposition, cela arrête le téléchargement au delà de 3 images mais je voudrais alors afficher un message "pas plus de 3 images"

Merci :)

Mammouth du PHP | 856 Messages

15 déc. 2018, 17:57

Tu peux t'inspirer de https://stackoverflow.com/questions/304 ... -selection ou https://stackoverflow.com/questions/204 ... select-box en limitant la valeur « lenght » et la vérifiant à chaque fois qu'un élément est sélectionné ou désélectionné.

Si non, je ne comprends pas ta question.
Soyez artisans de paix

Eléphant du PHP | 233 Messages

15 déc. 2018, 18:40

Non, c'est une fois 3 images chargées que je veut indiquer que le nombre d'image est limité à 3 (pas lors de la sélection)
Je peux pas le faire en PHP sinon je suis obligé de recharger la page
for(var i=0; i<3; i++) marche et limite le chargement, je voudrais afficher un message pour indiquer "pas plus de 3 images"

Mammouth du PHP | 856 Messages

15 déc. 2018, 19:07

Dans ce cas il suffit de vérifier le nombre d'images comme tu le faisais et d'afficher une alerte comme suit:

Code : Tout sélectionner

if (files.length > 3) { alert("Seules les 3 premières images sont chargées"); }
Tu pourrais aussi définir une variable avant ta boucle for afin d'enregistrer les images qui ont été bel et bien chargées et y conserver les noms des fichiers conservés. Ainsi, dans ton message d'erreur tu pourrais préciser « Voici les trois images que nous avons conservées : bla, ble, bli »
Soyez artisans de paix

Mammouth du PHP | 856 Messages

15 déc. 2018, 19:13

Tiens, en plus je te donne le code:

Code : Tout sélectionner

var lesFichiers = new Array(); for($count=0; $count<3; $count++) { $file_name = $_FILES["file"]["name"][$count]; lesFichiers[$count] = $file_name; $tmp_name = $_FILES["file"]['tmp_name'][$count]; .... .... .... } if (files.length > 3) { alert("Seules les images suivantes ont été chargées : \n " + lesFichiers[0] + "\n " + lesFichiers[1] + "\n " + lesFichiers[2] + ""); }
Soyez artisans de paix

Mammouth du PHP | 856 Messages

15 déc. 2018, 19:15

En version simplifiée:

Code : Tout sélectionner

for($count=0; $count<3; $count++) { $file_name = $_FILES["file"]["name"][$count]; $tmp_name = $_FILES["file"]['tmp_name'][$count]; .... .... .... } if (files.length > 3) { alert("Seules les images suivantes ont été chargées : \n " + $_FILES["file"]["name"][0] + "\n " + $_FILES["file"]["name"][1] + "\n " + $_FILES["file"]["name"][2] + ""); }
Soyez artisans de paix

Eléphant du PHP | 233 Messages

15 déc. 2018, 21:09

Merci pour cette réponse, mais n'étant pas spécialiste, à quel endroit je dois mettre ce code ? c'est les .... ...... ...... que je ne comprends pas :)

Mammouth du PHP | 856 Messages

16 déc. 2018, 02:29

C'est ton code.
les ...
représentent seulement ton code que je n'ai pas répété, comme dans une citation tronquée [...] mais ici les crochets étant frimés j'ai fait sans crochet.
Soyez artisans de paix

Eléphant du PHP | 233 Messages

16 déc. 2018, 12:03

Re-bonjour,

j'ai supposé que c'était dans le fichier upload.php qu'il faut mettre ce code. J'ai donc fait ceci mais cela ne change rien aucun message ne s'affiche et je peux toujours charger plus de 3 images l'une après l'autre (pas en même temps : quand je charge plus de 3 images en même temps là le message d'erreur s'affiche correctement).

if(count($_FILES["file"]["name"]) > 0)
{
 //$output = '';
 sleep(3);
 ?>
<script>var lesFichiers = new Array();</script>
<?php
 
 for($count=0; $count<count($_FILES["file"]["name"]); $count++)
 {
  $file_name = $_FILES["file"]["name"][$count];
  $tmp_name = $_FILES["file"]['tmp_name'][$count];
  $file_array = explode(".", $file_name);
  $file_extension = end($file_array);
  if(file_already_uploaded($file_name, $bdd))
  {
   $file_name = $file_array[0] . '-'. rand() . '.' . $file_extension;
  }
 
   $location = 'img/' . $file_name;
  
  if(move_uploaded_file($tmp_name, $location))
  {
  $query = "
   INSERT INTO tbl_images(image_name,id_membre, id_annonce) VALUES ('".$file_name."', '".$_SESSION['id']."', '0')
   ";
   $statement = $bdd->prepare($query);
   $statement->execute();
   
	
 }
   }
   
   ?>
 
	<script> if (files.length > 3) { alert("Seules les images suivantes ont été chargées : \n " + $_FILES["file"]["name"][0] + "\n " + $_FILES["file"]["name"][1] + "\n " + $_FILES["file"]["name"][2] + ""); }
	</script>
	<?php
  }

Mammouth du PHP | 856 Messages

16 déc. 2018, 15:00

Relie ma réponse du 6 décembre.
Soyez artisans de paix

Eléphant du PHP | 233 Messages

16 déc. 2018, 15:16

Question : est-ce bien dans le fichier upload qu'il faut mettre le code ? ensuite quand je relie avec la réponse du 06/12 en remplaçant or(var i=0; i<files.length; i++) par for(var i=0; i<3; i++) dans le fichier html, le téléchargement est bien limité à 3 images (sans message d'erreur).
Le problème aussi est que quand je supprime une des images, je ne peux plus en télécharger une autre (pourtant je n'ai que 2 images).
Modifié en dernier par cris84 le 16 déc. 2018, 19:09, modifié 1 fois.

Mammouth du PHP | 856 Messages

16 déc. 2018, 15:24

Inutile de nous balancer tout ton code.
Nous ne sommes pas ici pour coder à ta place, mais pour t'aider à faire ton propre code.
Il faut que tu comprennes la fonction de base if () { } else { }
En français, ça se traduit par si (condition) { (action posée si la condition est respectée) } sinon { (action posée si la condition n'est pas respectée) }

Dans le cas qui t'intéresse, trouve l'erreur du morceau de code suivant:

Code : Tout sélectionner

if(files.length > 3) { error_images += 'Vous ne pouvez pas t&eacute;l&eacute;charger plus de 3 images'; } else { for(var i=0; i<3; i++) { ... }
Piste:
S'il y a plus de 3 fichiers, dis-le.
S'il n'y a pas pas plus de 3 fichiers ( else) fais ceci.

Est-ce bien ce que tu veux ?
Selon ma compréhension de ton projet, je crois que non.
Il faut donc replacer les morceaux dans le bon ordre.

Fais-nous grâce de tout ton code, mais retourne-moi la structure que tu croiras correcte en vue d'arriver à tes fins.
Soyez artisans de paix

Eléphant du PHP | 233 Messages

16 déc. 2018, 19:16

Désolé pour le code, je viens de le supprimer.
Le if et else existent aussi en PHP que je maîtrise comme il faut. Je ne demande pas à ce que quelqu'un code pour moi mais je n'arrive pas à comprendre le fonctionnement.
Le code d'hier fait référence à mon script PHP, puis les autres visiblement correspondent à mon code qui est dans le html. J'avoue m'y perdre....
if(files.length > 3) j'affiche le message pas plus de 3 images en même temps
sinon for(var i=0; i<3; i++) j'affiche un autre message si i est > à 3
Bref, je n'arrive pas à comprendre