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

JavaScript Discussion :

[AJAX] Faire passer une variable $_FILE par AJAX


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Artisan menuisier alu pvc
    Inscrit en
    Février 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Artisan menuisier alu pvc

    Informations forums :
    Inscription : Février 2007
    Messages : 23
    Par défaut [AJAX] Faire passer une variable $_FILE par AJAX
    Bonjour, j'aimerais faire un script d'upload en AJAX/PHP, cependant j'ai du mal à faire passer le input type="file"...
    J'ai essayer en faisant passer son .value et en recréant la variable dans le fichier php:
    $_FILE['file'] = $valueDuInput; mais apparement c'était trop beau pour que sa marches, sa ne dois pas marcher car sa ne recré pas les variable $_FILE['file']['size'] etc...

    Voici mon JS (il vous paraîtras un peu bizarre, je n'utilises pas la class par défaut de l'ajax, j'utilises celle de Nicolas LE GALL:
    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
    function upload(element, linkfile, linkbouton, linkerror, linkhidden) // Upload d'image
    {
    	if(linkfile.value == '') 
    	{
    		if (document.getElementById) document.getElementById(linkerror).innerHTML = 'Champs non renseigné.';
    	}
    	else
    	{
    		var xhr = new XHR();
    		xhr.loading = function(xhr)
    		{
    			linkbouton.value = 'Chargement...';
    			linkbouton.disabled = true;
    		}
    		xhr.complete = function(xhr)
    		{
    			var regErreur = new RegExp ('^E:', 'i');
    			var erreur = xhr.responseText.match(regErreur);
    			if(erreur)
    			{
    				msgErreur = xhr.responseText.replace(regErreur, '');
    				linkbouton.value = 'Uploadez!';
    				linkbouton.disabled = false;
    				if (document.getElementById) document.getElementById(linkerror).innerHTML = msgErreur;
    			}
    			else
    			{
    				linkhidden.value = xhr.responseText;
    				linkbouton.value = 'OK';
    			}
    		}
    	}
    	var file = linkfile.value;
    	xhr.appendData('file', file);
    	xhr.appendData('type', element);
    	xhr.send('ajax/upload.php');
    }
    Voici mon code php:
    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
    <?php
    	function upload($file, $type)
    	{
    		include('../config.php');
    		mysql_connect($host, $user, $pass);
    		mysql_select_db($db);
    		$_FILE['file'] = $file;
    		$config_sql = mysql_query('SELECT * FROM config');
    		$config = mysql_fetch_array($config_sql);
    		$error = '';
    		switch($type)
    		{
    			case 'signature':
    				$max_width = $config['signature_max_width'];
    				$max_height = $config['signature_max_height'];
    				$max_size = $config['signature_max_size'];
    				break;
    			case 'bouton_partenaire':
    				$max_width = $config['bouton_partenaire_max_width'];
    				$max_height = $config['bouton_partenaire_max_height'];
    				$max_size = $config['bouton_partenaire_max_size'];
    				break;
    			case 'banniere_partenaire':
    				$max_width = $config['banniere_partenaire_max_width'];
    				$max_height = $config['banniere_partenaire_max_height'];
    				$max_size = $config['banniere_partenaire_max_size'];
    				break;
    			default:
    				$max_width = NULL;
    				$max_height = NULL;
    				$max_site = NULL;
    		}
    		if($max_width == NULL OR $max_height == NULL OR $max_size == NULL)
    		{
    			$error = "E:Type d'upload invalide";
    		}
    		else
    		{
    			if($_FILE['file']['error'] > 0) // Si le transfert du fichier n'a pas eu lieu
    			{
    				$error = "E:Erreur lors du tranfsert du fichier.";
    			}
    			else
    			{
    				if($_FILE['file']['size'] > $max_size) // Si le fichier est trop lourd
    				{
    					$error = "E:Le fichier est trop lourd, limitée à ".$max_size/1024 ."Ko.";
    				}
    				else
    				{
    					$extension_valides = array('jpg', 'jpeg', 'gif', 'png');
    					$extension_file = substr(strrchr($_FILE['file']['name'], '.'),1);
    					if (!in_array($extension_file,$extensions_valides))
    					{
    						$error = "E:Le type de fichier n'est pas valide.";
    					}
    					else
    					{
    						$file_sizes = getimagesize($_FILE['file']['tmp_name']);
    						if ($file_sizes[0] > $max_width OR $file_sizes[1] > $max_height)
    						{
    							$error = "E:L'image est trop grande, limitée à ".$max_width."*".$max_height.".";
    						}
    						else
    						{
    							$microtime = microtime();
    							$destination_file = $config['partenaire_upload_doc'].str_replace(' ','',$type.'_'.$nom.'_'.$microtime);
    							$transfert_file = move_uploaded_file($_FILE['file']['tmp_name'],$destination_file);
    							if (!$transfert_file)
    							{
    								$error = "E:Erreur lors du transfert du fichier, si l\'erreur persiste, merci d\'en informer le webmaster.";
    							}
    						}
    					}
    				}
    			}
    		}
    		if (!empty($error))
    		{
    			return $error;
    		}
    		else
    		{
    			return $destination_file;
    		}
    	}
    echo upload($_POST['file'], $_POST['type']);
    ?>
    Il n'existe pas un troisieme format de requête, GET, POST et FILE, non?

  2. #2
    Membre Expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Par défaut
    Ce que tu cherches à faire n'est pas possible en AJAX...

  3. #3
    Invité de passage
    Inscrit en
    Février 2007
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 1
    Par défaut
    Il n y a que GET et POST, il faut utiliser la methode POST ça c'est sure
    est ce que t'as essayé de spécfier le type d'encodage "multipart/form-data" ??

  4. #4
    Membre confirmé
    Étudiant
    Inscrit en
    Décembre 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2005
    Messages : 60
    Par défaut
    FremyCompany es-tu sûr ?
    Même en spécifiant le type des données que l'on envoie ? et en envoyant en POST ?
    Il y a-t-il pas possibilité de le faire avec des frame ?

    Mais bon en même temps je pense que c'est pas tellement la solution !

  5. #5
    Membre Expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Par défaut
    Citation Envoyé par sacados1
    FremyCompany es-tu sûr ?
    Même en spécifiant le type des données que l'on envoie ? et en envoyant en POST ?
    Il y a-t-il pas possibilité de le faire avec des frame ?

    Mais bon en même temps je pense que c'est pas tellement la solution !
    J'en suis certain, oui.

    En effet une frame caché est une bonne solution.


    Un essai vite comme ca :
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <iframe name="frame1" id="frame1" style="visibility: hidden; width:0px; height: 0px; position: absolute; top:-1px; left:-1px"></iframe>
    <form name="form1" id="form1" target="frame1"><input type="file" name="file1" /></form>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function asyncSend(callBack) {
       document.forms["form1"].submit();
       window.frames["frame1"].onload = callBack;
    }
     
    // utilisation
    asyncSend(function() {
      var win = this;
      var doc = this.document;
      // ...
    })

  6. #6
    Membre confirmé
    Étudiant
    Inscrit en
    Décembre 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2005
    Messages : 60
    Par défaut
    Encore moi !

    Je comprend pas bien. Désolais ça fait que 1 mois que j'exploite javascript !
    Je comprend pas la fonction callback ... et quand tu mets utilisation de celle-ci c'est un peu du chinois pour moi

  7. #7
    Membre Expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Par défaut
    ben c'est simple, une fonction c'est une variable et je l'utilise comme tel
    Voici un essemble de codes similaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function f1() { /* ... */ }
    setTimeout(f1, 1000)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var f1 = function() { /* ... */ };
    setTimeout(f1, 1000)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setTimeout(function() { /* ... */ }, 1000)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AJAX] Récupérer une variable retournée par ajax
    Par renaud26 dans le forum jQuery
    Réponses: 7
    Dernier message: 03/07/2015, 00h00
  2. [PHP 5.2] Impossible de passer une variable php en ajax
    Par rama56 dans le forum Langage
    Réponses: 4
    Dernier message: 14/04/2015, 17h22
  3. Réponses: 0
    Dernier message: 07/06/2012, 16h07
  4. Réponses: 2
    Dernier message: 11/05/2010, 10h12
  5. [AJAX] Faire passer une variable AJAX dans autre chose qu'un <div></div>
    Par fixbraun dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/02/2009, 14h34

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