Bonjour, je suis en train de réaliser un site pour un client sous cakePHP. J'ai créé ma fonction de gestion des médias mais je n'arrive pas à faire fonctionner le plus in Drag & Drop sur mon site.
Voici Le code d'upLoad :

<?php
    // Création des dossiers de sauvegarde
    $dir = IMAGES . 'Medias' . DS . date('Y');
    if (!file_exists($dir)) mkdir($dir, 777);
    $dir .= DS . date('m');
    if (!file_exists($dir)) mkdir($dir, 777);
    // Récupération du média envoyé
    // Si le média est envoyé via le formulaire
    if (isset($this->request->data) && !empty($this->request->data)) $data = $this->request->data;
    else {
        // Ou si le média est envoyé via le plug in de drag and grop
        $headers = getallheaders();
        $source = file_get_contents('php://input');
        file_put_contents(IMAGES . 'Medias/tmp/' . $headers'x-file-name'], $source);
        $data = array(
            'Media' => array(
                'name' => $headers'x-file-name'],
                    'file' => array(
                        'name' => $headers'x-file-name'],
                        'tmp_name' => IMAGES . 'Medias/tmp/' . $headers'x-file-name']
                    )
            )
        );
    }
    // Récupération du nom du fichier pour la réécriture du nom
    $file = explode('.', $data'Media']'file']'name']);
    $extention = strtolower(end($file));
    $filename = strtolower(Inflector::slug(sha1(implode('.', array_slice($file,0,-1))) . '-' . md5(time()), '-'));

    // Enregistrement de l'image
    $this->Session->setFlash('Le media a bien été sauvegardé.', 'adminNotif');
    move_uploaded_file($data'Media']'file']'tmp_name'], $dir . DS . $filename . '.' . $extention);
?>

Le problème c'est que la récupération via le drag and drop ne fonctionne pas... Enfin, plus précisément :

  • Drag&Drop de l'image : Ok

  • Envoi de la requète HTTP : Ok

  • Récupération du header : Ok

  • Déplacement de l'image dans un dossier temporaire (tmp) : Ok

  • Sauvegarde de l'image dans le dossier Medias/année/mois/ : Erreur

3 réponses


Tit-LoW
Auteur
Réponse acceptée

En faite j'ai réussi à trouver le problème.

<?php
    // Création des dossiers de sauvegarde
    $dir = IMAGES . 'Medias' . DS . date('Y');
    if (!file_exists($dir)) mkdir($dir, 777);
    $dir .= DS . date('m');
    if (!file_exists($dir)) mkdir($dir, 777);

    // Récupération du média envoyé
    // Si le média est envoyé via le formulaire
    if (isset($this->request->data) && !empty($this->request->data)) $data = $this->request->data;
    else {
        // Ou si le média est envoyé via le plug in de drag and grop
        $headers = getallheaders();
        $source = file_get_contents('php://input');
        file_put_contents(IMAGES . 'Medias/tmp/' . $headers'x-file-name'], $source);
        $data = array(
            'Media' => array(
                'name' => $headers'x-file-name'],
                    'file' => array(
                        'name' => $headers'x-file-name'],
                        'tmp_name' => IMAGES . 'Medias/tmp/' . $headers'x-file-name']
                    )
            )
        );
    }

    // Récupération du nom du fichier pour la réécriture du nom
    $file = explode('.', $data'Media']'file']'name']);
    $extention = strtolower(end($file));
    $filename = strtolower(Inflector::slug(sha1(implode('.', array_slice($file,0,-1))) . '-' . md5(time()), '-'));

    // Enregistrement de l'image
    $this->Session->setFlash('Le media a bien été sauvegardé.', 'adminNotif');
    copy($data'Media']'file']'tmp_name'], $dir . DS . $filename . '.' . $extention);
?>

Comme vous pouvez le constater. Plutot que de faire un move_uploaded_file(), il fallait faire un copy().

Rien dans les logs/console ?

Tit-LoW
Auteur

Js ne fait aucun log dans ma console. J'ai mis tout de même un petit console.log('Upload de' + file.name) au moment de l'upload pour mes tests et j'ai bien les message d'upload.
Dans mon dossier Medias/tmp/ j'ai bien l'image mais celle-ci n'est ni déplacée, ni supprimée (oui je supprime l'image tout à la fin pour désengorger un peu ce dossier.