Bonjour,
J'ai presque fini mon systèmes d'article et il me manque juste un truc à finir, l'upload d'image.
Je ne sais pas comment réaliser ceci, et comment autorisé un certain type de fichier.

J'aimerais stocker les fichiers dans un dossier et mettre juste le nom dans la base de donnée

Voici mon compte php

if(!empty($_POST)){

$errors = array();

if(empty($_POST['title'])){
    $errors['title'] = "Impossible d'entrer un titre vide";
}

if(empty($_POST['image'])){
    $errors['image'] = "Merci d'entrer l'url d'une image";
}

if(empty($_POST['slug']) || !preg_match('/^[a-zA-Z0-9_-]+$/', $_POST['slug'])){
    $errors['slug'] = "Slug non valide";
}

if(empty($_POST['content'])){
    $errors['content'] = "Merci d'entrer un contenu";
}

if(empty($errors)){
    try {
        $req = $pdo->prepare("UPDATE articles SET title = ?, slug = ?, image = ?, content = ?, modified_at = NOW(), modified_by = ?");
        $pdo->exec("SET CHARACTER SET utf8");
        $req->execute([
          $_POST['title'],
          $_POST['slug'],
          $_POST['image'],
          $_POST['content'],
          $_SESSION['auth']->id
          ]);
        session_start();
        $_SESSION['flash']['green'] = 'Article modifié';
        header('Location: ' . $site_url . '/article?id=' . $_GET['id'] . '&slug=' . $_POST['slug']);
    }catch(PDOException $e){
        echo $e;
    }
}

}

Si vous pouvez me donner un petit coup de main, merci

10 réponses


Crazyweeds
Réponse acceptée

tu peux verifier le type de fichier avec avec la la variable superglobale

 $_FILES['monfichier']['type'].

Pareil pour le nom tu peux le recuperer a l'aide de

 $_FILES['monfichier']['name'].

N'oublie pas d'ajouter l'attribut

enctype="multipart/form-data"

à ton formulaire. et pour l'input c'est tout simplement

<input type="file" name="monfichier" />

Edit : j'oubliais, tu peux deplacer les fichier a la l'aide de la fonction php suivante : move_uploaded_file

Avec ca, tu devrais pouvoir t'en sortir

cyyynthia
Réponse acceptée
// ETAPE 1 : Configuration
$validExt = array(
 'png',
 'jpg',
 '...'
);

// ETAPE 2 : Vérification
$ext = EXTENTION;
if(!in_array($ext, $validExt)){
 die() // Pas ok sur l'extension
} else {
 $curl = curl_init();
 curl_setopt($curl, CURLOPT_URL, -url-);
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 $data = curl_exec($curl);
 curl_close($curl);

 $fp = fopen('destination','a+');
 fwrite($fp, $data);
 fclose($fp);
}
// BDD

A mon avis, faut que tu suives cette architecture

  • Tu vérifie l'extension :
    • Tu la récupérés
    • Tu la compares à un Array contenant les extensions acceptées
  • Tu récupérés l'image avec CURL et tu la sauvegardes avec un fopen puis un fwrite, en générant un nom unique (timestamp.extention) que tu sauvegardes dans une variable
  • Tu envoie ta variable dans ta bdd.

Si tu as besoin d'un bout de code n'hésite pas ! :)

Yubo
Auteur

@Bowser65
Merci de ta réponse, oui si tu pourrais me fournir un bout de code, car la je suis perdu :')

Yubo
Auteur

merci beaucoup

C'est vraiment succinct, mais ca te donne les bases, penses également a verifier et limiter la taille des fichiers. Si vraiment tu n'arrives pas t'en sortir, n'hésites pas a redemander de l'aide

Yubo
Auteur

pas de problèmes merci

Yubo
Auteur

J'ai récupéré un script sur internet, comme je pourrais modifier le nom de l'image lorsqu'elle est sauvegardé et récupéré le nom par exemple:
Le fichier X.png a bien été uploadé

if( isset($_POST['upload']) ) // si formulaire soumis
{
    $content_dir = 'upload/'; // dossier où sera déplacé le fichier

    $tmp_file = $_FILES['fichier']['tmp_name'];

    if( !is_uploaded_file($tmp_file) )
    {
        exit("Le fichier est introuvable");
    }

    // on vérifie maintenant l'extension
    $type_file = $_FILES['fichier']['type'];

    if( !strstr($type_file, 'jpg') && !strstr($type_file, 'jpeg') && !strstr($type_file, 'bmp') && !strstr($type_file, 'gif') )
    {
        exit("Le fichier n'est pas une image");
    }

    // on copie le fichier dans le dossier de destination
    $name_file = $_FILES['fichier']['name'];

    if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )
    {
        exit("Impossible de copier le fichier dans $content_dir");
    }

    var_dump($_POST);
    echo "Le fichier a bien été uploadé";
}

merci

Dans le script que tu as là, modifie la valeur de $name_file. Pour recuperer le nom du fichier, bah utilise aussi $name_file

Yubo
Auteur

Le script fonctionne bien sur une page vide mais lorsque que j'essaye de le mettre sur le reste de mon script $_FILES est vide
j'ai bien mis le form enctype="multipart/form-data"

<div class="input-field col s6 white-text"><input type="file" name="fichier" size="30"></div>
$content_dir = '../upload';
    $tmp_file = $_FILES['fichier']['tmp_name'];
    if( !is_uploaded_file($tmp_file) )
    {
        $errors['image'] = 'Merci de renseigner une image';
    }
    // on vérifie maintenant l'extension
    $type_file = $_FILES['fichier']['type'];
    if(!strstr($type_file, 'jpg') && !strstr($type_file, 'jpeg') && !strstr($type_file, 'png') && !strstr($type_file, 'gif')){
        $errors['image'] = 'Le fichier envoyé n\'est pas une image';
    }
    $str = 'abc32EGG64fefrgFEe654ZFKJZDF';
    $shuffled = str_shuffle($str);
    $name_file = $shuffled . $_FILES['fichier']['name'];
    if(!move_uploaded_file($tmp_file, $content_dir . $name_file)){
        $errors['image'] = 'Impossible de copier le fichier dans ' . $content_dir;
    }