IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Upload de fichier PDF avec traitement jQuery/Ajax


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Février 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2013
    Messages : 63
    Points : 57
    Points
    57
    Par défaut Upload de fichier PDF avec traitement jQuery/Ajax
    Bonjour à tous chers amis,

    Voilà je rencontre des difficultés pour uploader des fichiers PDF avec un traitement PHP mais qui passe avant par un traitement jQuery/Ajax.

    Je pense que le problème vient du côté PHP mais j'arrive pas à voir ce qui peut clocher... voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
     
    <?php
    session_start();
     
    if($_POST) {
    	require_once '../includes/config.php';
     
    	$q=$db->prepare('SELECT id FROM categories WHERE noms=?');
    	$q->execute(array($_POST['newCat']));
    	$r=$q->fetch();
     
    	$q=$db->prepare('SELECT * FROM marques WHERE marques = ?');
    	$q->execute(array($_POST['newMark']));
    	$res=$q->fetch();
     
     
    	$success = "error";
     
    	if(!empty($_POST['nomProd'])){
    		 $_SESSION['debug'] = '1';
     
    		if(!empty($_POST['cat']) || !empty($_POST['newCat'])) {
    			 $_SESSION['debug'] = '2';
     
    			if(!empty($_POST['mark']) || !empty($_POST['newMark'])){
    				 $_SESSION['debug'] = '3';
     
    				if(empty($res['id'])){
    					 $_SESSION['debug'] = '4';
     
    					if($_POST['newMark'] != $res['marques']) {
    						 $_SESSION['debug'] = '5';
     
    						if (isset($_FILES) && !empty($_FILES['file']['tmp_name'])) {
    							 $_SESSION['debug'] = '6';
     
    							$content_dir="../pdf/"; // dossier où sera déplacé le fichier
    							$nom = $_FILES['file']['name']; //le nom de ton fichier (par exemple : image.jpg)
    							$tmp_file = $_FILES['file']['tmp_name']; //le nom du fichier dans le dossier tmp
    							$type = strrchr($_FILES['file']['name'], '.'); //l'extension du fichier (par exemple : .jpg)
    							$poids = filesize($_FILES['file']['tmp_name']); //le poids du fichier en octet
     
    							//liste des extensions que tu traiteras
    							$extension = array('.pdf');
     
    							//Poids maximum autorisé pour l'upload (voir dans le fichier PHP.ini : généralement 2mo)
    							$maxTaille = 8000000;
     
    							//Corrige les caractères avec accents et remplace les espaces et caractères speciaux par -
    							//Evite les problèmes par la suite.
    							$nom = strtr($nom,
    							 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
    							 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy'); 
    							$nom = preg_replace('/([^.a-z0-9]+)/i', '-', $nom);
     
    							//On contrôle que le fichier est bien présent dans le dossier tmp
    							if (is_uploaded_file($tmp_file)) {
    								 $_SESSION['debug'] = '7';
     
    								//On contrôle si l'extension est présente dans ta liste $extension
    								if(in_array($type, $extension)){ 
    									 $_SESSION['debug'] = '8';
     
    									//On contrôle que le poids est effectivement bon
    									if($poids<=$maxTaille){
    										 $_SESSION['debug'] = '9';	 
    										//Si tout se passe bien on Upload dans ton dossier de destination.
    										if(move_uploaded_file($tmp_file, $content_dir.$nom)) {
    											 $_SESSION['debug'] = '10';
    											$success = "agree";
     
    											$req=$db->prepare('INSERT INTO notices (nom, cat_id, newCat, marque_id, newMark, pdf) VALUES (:nom, :catId, :newCat, :mId, :newMark, :pdf )');
    											$req->bindValue(':nom', $_POST['nomProd'], PDO::PARAM_STR);
    											$req->bindValue(':catId', $_POST['cat'], PDO::PARAM_INT);
    											$req->bindValue(':newCat', $_POST['newCat'], PDO::PARAM_STR);
    											$req->bindValue(':mId', $_POST['mark'], PDO::PARAM_INT);
    											$req->bindValue(':newMark', $_POST['newMark'], PDO::PARAM_STR);
    											$req->bindValue(':pdf', $nom, PDO::PARAM_STR);
    											$req->execute();
     
    											$message = 'Votre notice a bien été soumise.<br />Cependant elle sera définitivement validée qu\'une fois vérifiée par nos services.';
    										}
    										else
    										$message = "Le fichier est introuvable.";
    									}
    									else
    									$message = "Le fichier est trop gros";
    								}
    								else
    								$message = "Le format du fichier n\'est pas un PDF";
    							}
    							else 
    							$message="Impossible de copier le fichier dans" .$content_dir;								
    						}
    						else
    						$message = "Vous devez choisir un fichier PDF";
    					}
    					else
    					$message = "Cette marque éxiste d&eacute;jà";
    				}
    				else
    				$message = "Cette catégorie éxiste déjà";
    			}
    			else
    			$message = "Vous devez soit choisir de sélectionner une marque soit suggérer une nouvelle marque";
    		}
    		else 
    		$message = "Vous devez soit choisir de sélectionner une catégorie soit suggérer une nouvelle catégorie";
    	}
    	else
    	$message = "Vous devez nommer une marque + référence pour valider le formulaire";
     
    	echo json_encode([
    		'message' => $message,
    		'success' => $success
    	]);
    }
    Je mets au cas où le jQuery aussi pour voir si l'erreur pourrait pas venir de là et pour éviter les doubles posts ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    $(document).ready(function(){
            $('form').on('submit', function(e) {
     
    		var $form = $(this);
            var formdata = (window.FormData) ? new FormData($form[0]) : null;
            var data = (formdata !== null) ? formdata : $form.serialize();
     
    		$.ajax({
    			url: $form.attr('action'),
                type: $form.attr('method'),
                contentType: false, 
                processData: false, 
    			data: data,
    			dataType: 'json',
     
    			beforeSend: function(){
    				$('.loading').show();
    				$(':input[type=text]','form').val('');
    				$(':input[type=file]','form').val('');
    			},
     
    			success:function(data){
    				$('.loading').hide();
    				if(data.message){
    					$('.message').addClass(data.success).html(data.message).fadeIn(600);
    					setTimeout(function(){
    						$('.message').fadeOut(400);
    						$('section').load('contenu')
    						$('section').load('aside');
    					}, 4000);
    				}
    			}
    		});
    		return false;
    	});
    });
    J'ai un message qui s'affiche dans la console cependant :

    Warning Provisional headers are shown
    et ceci tout est ok sinon :

    ------WebKitFormBoundaryr6A0Brs9AKXujioN
    Content-Disposition: form-data; name="nomProd"

    Brother VX640
    ------WebKitFormBoundaryr6A0Brs9AKXujioN
    Content-Disposition: form-data; name="cat"

    1
    ------WebKitFormBoundaryr6A0Brs9AKXujioN
    Content-Disposition: form-data; name="newCat"


    ------WebKitFormBoundaryr6A0Brs9AKXujioN
    Content-Disposition: form-data; name="mark"

    0
    ------WebKitFormBoundaryr6A0Brs9AKXujioN
    Content-Disposition: form-data; name="newMark"

    Brother
    ------WebKitFormBoundaryr6A0Brs9AKXujioN
    Content-Disposition: form-data; name="file"; filename="Brother VX640 1 à10 Sophie(1).pdf"
    Content-Type: application/pdf


    ------WebKitFormBoundaryr6A0Brs9AKXujioN--
    Mais bon voilà... il se passe rien et au bout de quelques minutes, il m'affiche le message erreur PDF vide et passe en status ok 200...

    Je comprends rien à ce qu'il se passe...

    Merci pour votre aide

  2. #2
    Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Février 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2013
    Messages : 63
    Points : 57
    Points
    57
    Par défaut
    Bon alors maintenant voilà un autre soucis... en fait j'essaye d'uploader un fichier très lourd ^^ d'où les minutes avant la ok 200 en revanche j'ai une erreur qui s'affiche après validation :

    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'pdf' cannot be null' in /home/weblobsd/public_html/notices/php/ajoutNotices.php:67 Stack trace: #0 /home/weblobsd/public_html/notices/php/ajoutNotices.php(67): PDOStatement->execute() #1 {main} thrown in /home/weblobsd/public_html/notices/php/ajoutNotices.php on line 67
    la ligne 67 correspond à ma requête en fait...
    et elle n'est pas supposé être null ici...

  3. #3
    Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Février 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2013
    Messages : 63
    Points : 57
    Points
    57
    Par défaut
    bon problème résolu mais j'ai toujours la réponse {"message":null,"success":"agree"}

    ça signifie qu'il valide bien les données mais n'affiche pas ma bulle info comme quoi le formulaire a été validé... pourquoi me retourne t'il NULL ?

    je comprends pas.

    L'insertion en BDD se fait bien pourtant...

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par stefde3 Voir le message
    ... en fait j'essaye d'uploader un fichier très lourd ^^
    Salut,

    Si tu veux pouvoir uploader des fichiers sans limite de taille il y a une solution ici qui surpasse les configurations serveur. C'est prêt à l'emploi avec de nombreuses options (barre de progression, contrôle de taille ou d'extensions, reprise d'upload etc...).

    Sinon si tu veux poursuivre avec ton code pour des "petits" fichiers qui ne dépassent pas la configuration "upload_max_filesize" du serveur, il faut contrôler la taille côté javascript avant l'upload car ça évite d'avoir à attendre de très longues minutes pour s'entendre dire au final que le fichier est trop gros (pas top comme expérience utilisateur). Et puis si tu dépasse la configuration "post_max_size" du serveur, les variables post et files seront nulles côté php...

  5. #5
    Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Février 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2013
    Messages : 63
    Points : 57
    Points
    57
    Par défaut
    Non ça c'est pas un soucis, de plus avec mon hébergeur j'ai accès au php.ini.

    Mon soucis réside juste dans mes conditions PHP lors du traitement car certains retournent NULL et je comprends pas pourquoi...

    j'ai modifié mon premier post

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Si j'ai bien compris, l'upload du fichier et l'enregistrement en bdd fonctionnent correctement et c'est seulement le retour ajax qui pose problème ?
    - Peut-être ton serveur n'est pas en php 5.4 (tu utilise une notation tableau disponible à partir de 5.4)
    - Essaies de faire fonctionner ton script php indépendamment d'ajax (sans upload de fichier) pour voir si le retour attendu est correct.

Discussions similaires

  1. [1.x] upload de fichiers multiple avec AJAX ou jQuery
    Par CobraSA dans le forum Symfony
    Réponses: 6
    Dernier message: 21/01/2011, 16h52
  2. [FPDF] Créer un fichier pdf avec PHP
    Par picoloto dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 24/09/2008, 23h05
  3. Ouvrir un fichier Pdf avec access
    Par willytito dans le forum Access
    Réponses: 1
    Dernier message: 13/08/2006, 20h37
  4. [FPDF] Génération de fichiers PDF avec PHP
    Par deY! dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 10/04/2006, 18h06
  5. [FPDF] Cherche informations pour afficher un fichier pdf avec PHP
    Par Hans_B dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 22/03/2006, 12h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo