Un sujet visible souvent abordé... UPLOAD de fichier... Proposition de création

DBU
Eléphanteau du PHP | 42 Messages

05 sept. 2008, 22:37

Bonjour à tous,
Un sujet visible souvent abordé... UPLOAD de fichier... Proposition de création de tutoriel très détailler car je vois que bcq de monde galère avec cela.

Avec ligne par ligne les commentaires de quoi on trouve ou l'on sert.

En commençant par l'envoie d'un fichier tout simple et fixe vers le serveur. après pour le rendre variable.

L'aide des experts et un néophyte comme moi pour dire ce que je comprends pas et demander plus de détail cela devrait nous donner un truc pas mal au final.

Merci pour votre aide.

Cela sera du service Public...

Voila je mene 2 projets simultanément :

L'un chez free et l'autre sur mon propre serveur et mon réseau d'entreprise.

Projet 1 :

Sur mon réseau d'entreprise, j'ai mis en place un poste sur lequel je fais tourner le easyphp.
Avec mon code php.

Je désire depuis un poste client permettre l'envoie de fichier sur mon poste (serveur).

Faut-il obligatoirement monté sur ce poste un serveur FTP ?

je précise que à l'avenir le tout sera très certainement migrer sur un vrai serveur Externalisé chez un prestataire.

Projet 2 :

Pour l'asso de Foot de mon village je monte un site en PHP.
Je désire pouvoir upload des fichiers sur le serveur Free.


J'ai fais pas mal de test de code trouver ici ou là sur le net mais je comprends pas tout. les codes s'exécute sans erreur mais il ne se passe rien ou avec d'autre je prends un erreur interne 500.

HELP ME and HELP US

Merci par avance

Bruno

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

06 sept. 2008, 00:39

Bonjour,

Je n'ai pas compris ton problème, tu peux nous le résumer en quelques lignes stp en indiquant:
- ce que tu as déjà essayé de faire
- là où tu bloques
- le message d'erreur rencontré

Merci :)
Faut-il obligatoirement monté sur ce poste un serveur FTP ?
La réponse est non ce n'est pas nécessaire.
Sur mon réseau d'entreprise, j'ai mis en place un poste sur lequel je fais tourner le easyphp
Pour développer EasyPHP c'est bien, mais comme c'est indiqué lors de son installation, il ne doit en aucun cas être utilisé en production
Quand tout le reste a échoué, lisez le mode d'emploi...

DBU
Eléphanteau du PHP | 42 Messages

07 sept. 2008, 21:33

Tout d'abord merci pour tes réponses...

Voilà j'ai pris le tuto qui est sur le site pour comprendre comment fonctionne l'ensemble ci dessous le code 30.htlm. (mon hébergeur est FREE)

Avec lui je prends l'erreur :

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to access /photo/test.jpg in /mnt/102/sdb/c/f/www.ascg.football/30.php on line 30

<?php

if(isset($_FILES['photo']))
{
  // params
  unset($erreur);
  $extensions_ok = array('png', 'gif', 'jpg', 'jpeg');
  $taille_max = 1000000;
  $dest_dossier = '/photo/';
  // vérifications
  if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) )
  {
    $erreur = 'Veuillez sélectionner un fichier de type png, gif ou jpg !';  
  }
  elseif( file_exists($_FILES['photo']['tmp_name']) 
          and filesize($_FILES['photo']['tmp_name']) > $taille_max)
  {
    $erreur = 'Votre fichier doit faire moins de 10000Ko !';
  }
  // copie du fichier
  if(!isset($erreur))
  {
    $dest_fichier = basename($_FILES['photo']['name']);
    // formatage nom fichier
    // enlever les accents
    $dest_fichier = strtr($dest_fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
    // remplacer les caracteres autres que lettres, chiffres et point par _
    $dest_fichier = preg_replace('/([^.a-z0-1]+)/i', '_', $dest_fichier);
    // copie du fichier
    move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier . $dest_fichier);
    chmod($dest_dossier . $dest_fichier,0640); 
  }
}

?>
<html>
<body>
<!-- Erreur ? -->
<?php 
if(isset($erreur)){
  echo '<p>', $erreur ,'</p>';
}
?>
<!-- Formulaire -->
<!-- Attention, ne de ne pas oublier le  enctype="multipart/form-data" -->
<form method="POST" action="30.php" enctype="multipart/form-data">
<!-- Limiter la taille des fichiers à 500Ko -->
<input type="hidden" name="MAX_FILE_SIZE" value="500000" /> 
<fieldset>
<legend>Envoi de fichiers</legend>
<!-- champs d'envoi de fichier, de type file -->
<p><label for="photo">Photo :</label><input type="file" name="photo" /></p>
<!-- bouton d'envoi -->
<p><input type="submit" name="envoi" value="Envoyer les fichiers" /></p>
</legend>
</fieldset>
</form>
</body>
</html>

Citation:
Faut-il obligatoirement monté sur ce poste un serveur FTP ?
La réponse est non ce n'est pas nécessaire.
Et bien là tu m'intéresser beaucoup peux tu expliquer ? le code est le même ?

D'autre part effectivement j'ai bien lu que EsayPHP ne peut ou ne doit être utiliser en production pourquoi ?
Une question de licence ou de technique (sécu)?

Qu'elle solution "Free", pouvez vous me conseiller à choisir ?

Bruno

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

08 sept. 2008, 11:13

Bonjour,
$dest_dossier = '/photo/'; 
Pourquoi ce slash au début???
Si tu met un slash au début, cela veut dire que tu veux mettre ton fichier à la racine du serveur de Free...
...ce qui est bien sûr bloqué pour des raisons évidentes de sécurité.
Retire le slash et ça devrait le faire si ton répertoire photo/ existe bien :)
Je désire depuis un poste client permettre l'envoie de fichier sur mon poste (serveur).
Faut-il obligatoirement monté sur ce poste un serveur FTP ?
La réponse est non ce n'est pas nécessaire.
Et bien là tu m'intéresser beaucoup peux tu expliquer ?
Je ne peux pas davantage te l'expliquer vu que les deux n'ont rien à voir :-D
C'est comme si tu me demandais si il était obligatoire de porter une montre pour conduire une voiture... la réponse est "Non ce n'est pas obligatoire"... :D

D'autre part effectivement j'ai bien lu que EsayPHP ne peut ou ne doit être utiliser en production pourquoi ?
Une question de licence ou de technique (sécu)?
Uniquement technique, il n'est pas prévu pour cela (sécurité, maintenance, etc...)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 447 Messages

08 sept. 2008, 14:12

Je commence à désespérer de trouver une solution pour l'upload de fichiers par formulaire (de + de 2Mo, ex. mp3) chez free, j'vais donc peut-être opter pour un hébergement payant...

Par contre j'ai vu un exemple de code qui permettrait de découper un fichier en morceaux suffisamment petits pour être uploadé chez free puis rassemblé en un fichier unique identique à l'original...
Vous connaissez et/ou avez un exemple de code pour réaliser une telle opération?

Edit:

J'avais mal lu l'explication, en fait il propose seulement une fonction pour rassembler les morceaux:
<?php
   function grouper($nom,$nombre)
   {
   $He = fopen($nom, 'a'); //ouvre le fichier de sortie
   for ($i=1;$i<=$nombre;$i++){ //pour chaque petit fichier
   if ($i>=1000) $forme=$i ; //met en format le numero sur 4 chiffres
   if ($i<1000) $forme="0".$i ;
   if ($i<100) $forme="00".$i ;
   if ($i<10) $forme="000".$i ;
   $test = $nom . $forme; //concatenation du nom de fichier
   $hr = fopen($test, 'r'); //ouvre le fichier d'entree en lecture
   while (!feof($hr)) //tant qu'il y a quelque chose a lire
   {
   $Data = fread($hr, 8192); //ben on le lit
   fwrite($He, $Data); //puis on l'ecrit
   }
   fclose($hr); //fermer le fichier d'entré
   } //et aller au suivant
   fclose($He); //on ferme de gros fichier final
   }
   grouper("file1.avi",2); //ligne d'exemple pour reconstituer un fichier avi
   ?>
Y a-t-il moyen de coder une fonction qui découpe le fichier envoyé par le formulaire comme je voudrais le faire? Peut-être que c'est pas possible ce que je demande...
Modifié en dernier par Stef le 08 sept. 2008, 14:40, modifié 1 fois.
Probably (only a) Human Problem?

DBU
Eléphanteau du PHP | 42 Messages

08 sept. 2008, 14:28

J'avais effectivement essayer comme cela sans le slash.
J'ai plus de message d'erreur la page s'affiche de nouveau sans message d'erreur.

j'ai fais un echo sur les lignes :

echo $_FILES['photo']['name']; ici je n'ai que le nom du fichier et pas le chemin,
Comment il fait pour trouver le tt (question idiote ?)

echo "<br>";
echo $dest_dossier. $dest_fichier; là c'est ok

DBU
Eléphanteau du PHP | 42 Messages

09 sept. 2008, 15:17

Les gars s'il vous plait aider je suis en manque d'inspiration total et je galère beaucoup.
j'ai tout le reste du code ok il me manque plus que l'upload.

Merci