Upload Drag & drop cakephp et OVH

Par Tit-LoW, il y a 13 ans


Bonjour,
J'ai développé il y a quelques temps un système d'upload drag & drop et mis le site complet sur la toile (ovh). En local, l'upload fonctionne niquel mais sur ovh c'est une autre paire de manches... La création des dossiers /Medias/{année}/{mois} fonctionne bien avec autorisation d'écriture :

// Création des dossiers de sauvegarde
$dir = IMAGES_URL . 'Medias' . DS . date('Y');
if (!file_exists($dir)) {
    mkdir($dir);
    chmod($dir, 0777);
}
$dir .= DS . date('m');
if (!file_exists($dir)) {
    mkdir($dir);
    chmod($dir, 0777);
}

Par contre le déplacement dans le dossier temporaire ne fonctionne pas...

// Récupération du média envoyé
$headers = getallheaders();
$source = file_get_contents('php://input');

// Stockage du chemin de l'image
$img = IMAGES_URL . 'Medias/tmp/' . $headers'x-file-name'];

// Copie de l'image temporaire sur le serveur
file_put_contents($img, $source);

La le serveur tourne en rond sans jamais rien répondre...

8 réponses

coloo, il y a 13 ans

regarde la valeur de $img et $source pour voir si c'est lse bon liens. J'avais aussi eu un peu de mal avec l'upload de media et il me semble que j'avais du remplacer \ par /.

Bonne continuation et tiens nous au courant de ton avancé.

++

Grafikart, il y a 13 ans

Tu as bien les bon droits / permission sur les dossiers ?

Tit-LoW, il y a 13 ans

@Grafikart : les droits sur le dossier Media et sous dossiers / fichiers sont bon (0777).
@coloo : Les valeurs de $img et $sources sont bons (pour m'en assuré j'avais renvoyé un console.log à chaque étape). Par contre je ne vois pas ce que tu entends par : "il me semble que j'avais du remplacer \ par /.". Tu parle de la fonction "file_get_contents('php://input')" ? Parce que la je n'ai pas d'anti-slashs.

Pour information, le site à été développé sur environnement Win (Win 7 + Apache2, mysql5, php5 + Modules additionnels), j'ai ensuite un petit serveur personnel sous linux (debian6) avec les même caractéristiques (Debian 6 + Apache 2, mysql5, php5 + Modules additionnels : urlrewrite, sendmail, etc.). Ce serveur me sert à tester les sites sur un environnement équivalent à un environnement de production. Caractéristiques du serveur perso :
2 Go de RAM, 750 Go de disque sur 2 partitions ('/' Partition primaire système, '/var/www/' Partition secondaire fichiers WEB). Sur mes deux environnements de test aucun souci, les fichiers s'uploadent bien. Par contre lors du passage chez OVH plus d'upload.

Ciloe, il y a 13 ans

Salut.

Je viens juste de créer le système sur ovh. Moi ça marchait pas car il connait pas la fonction getallheaders(). Je l'ai donc substitué!

if (!function_exists('getallheaders')){
    function getallheaders(){
        foreach ($_SERVER as $name => $value){
            if (substr($name, 0, 5) == 'HTTP_'){
                $headers[lcfirst(str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ',substr($name, 5))))))] = $value;
            }
        }
        return $headers;
    }
}

Mon upload marche nikel maintenant. Par contre, j'ai un autre soucie... Il ne comprends pas le json_encode() sur mon cake. Du coup j'ai regardé sur internet pour mettre en place le json_encore sur cake. Mais j'ai pas trouvé de solutions. Tu en aurais une?

Tit-LoW, il y a 13 ans

Je te remercie pour ta fonction. Le technicien OVH m'a expliqué qu'il était possible via le fichier .htaccess d'activer/désactiver certaines fonctions du php.ini. Pour ma part json est activé sur mon espace. Tu peux le savoir via le lien suivant : http://{offre}.ovh.net/infos/test.beta ensuite tu descends au paragraphe json et tu regarde l'état. Si celui-ci n'est pas activé tu vas sur le guide et tu recherches "ConfigPhp" pour savoir comment l'activer.

Ciloe, il y a 13 ans

Du coup tu as réussit à régler ton problème? Perso à part la fonction énoncée, je n'ai pas eu de problème (enfin sauf le json...)

Et mon json est bien activé, j'ai un site d'offre perso....

Tit-LoW, il y a 13 ans

J'ai la même offre que la tiennes. Si tu debug le retour json a partir du PHP tu te rends compte que la variable $source est vide. et c'est pour ça que tu as une erreur json.parse(). Si tu ne retournes rien il ne peut pas l'interprété.

Tit-LoW, il y a 13 ans

J'ai fini par trouver la solution. En faite j'ai totalement laissé tombé l'objet XHR pour passer sur l'objet FormData. Et la j'ai plus de soucis. [code](function($){ // Variables du plugin var options = { // Messages standards du drag&drop listenMessage : "Déposez vos fichier ici !", uploadMessage : "Upload des médias en cours...", // Script PHP liés à l'upload uploadScript : null, redirectScript : null, // Messages d'erreurs mediaFormat : { 0 : 'image/png', 1 : 'image/jpeg', 2 : 'image/gif'} }; // Fonction primaire du dropfile $.fn.dropFile = function(settings){ // On fusionne les tableaux d'options if (settings) $.extend(options,settings); // On ajoute le comportement dataTransfert à jQuery $.event.props.push("dataTransfer"); this.each(function(){ // Affichage du message d'écoute de l'upload $('').append(options.listenMessage).appendTo(this); // Evènements lié au drag&drop $(this).bind({ "dragenter dragover" : function(e) { do_nothing(e); $(this).addClass('over'); }, "dragleave" : function(e) { do_nothing(e); $(this).removeClass('over'); }, "drop" : function(e) { do_nothing(e); $(".dropfile.over span").html('Upload des images en cours...
<small></small>'); $(this).removeClass('over'); drop(e); } }); }); // Déclanchement de la fonction drag&drop function drop(e) { // Variable de définition des erreurs var returnError = false; // Début de compteur var count = 1; // Récupération des fichiers var files = e.dataTransfer.files; // Si des fichiers ont été envoyés if (files.length > 0) { // On boucle sur les fichiers for (var i in files) { // On vérifie que c'est bien un fichier if(files*.size!=undefined) { // Compteur de médias if (files.length > 1) $(".dropfile.over span small").html(count + ' / ' + files.length).show(); // On récupère le fichier en cours var fic = files*; // On créé l'objet FormData var fd = new FormData; // Vérification du format du média var validFormat = false; for (var j in options.mediaFormat) { if (fic.type == options.mediaFormat[j]) validFormat = true; } // Si il n'y à pas d'erreur et que le format est valide if (validFormat == true && returnError == false) { fd.append('fic',fic); // Requète AJAX pour l'envoi de fichiers $.ajax({ url : options.uploadScript, type : 'POST', data : fd, processData:false, contentType:false, complete:function(data){ var response = data.responseText; if(response.length > 0) { returnError = true; $('#ajaxError').addClass('notif-error').html('Erreur : ' + response).slideDown('300'); } else { if (count == files.length && returnError == false) document.location.href = options.redirectScript; } count++; } }); } } } } } // Fonction stoppant les fonction native lié à l'utilisation du drag & drop' function do_nothing(e){ e.stopPropagation(); e.preventDefault(); } } })(jQuery);[/code] Et la fonction d'upload dans mon controller média [code]<?php clas MediaController extends AppController {

    /*
     * Fonction d'upload pour le plugin
     */
    public function admin_upload($post_id) {            
        // Création des dossiers de sauvegarde
        $dir = IMAGES . 'Medias' . DS . date('Y');
        if (!file_exists($dir)) {
            mkdir($dir, 0777, true);
            chmod($dir, 0777);
        }
        $dir .= DS . date('m');
        if (!file_exists($dir)) {
            mkdir($dir, 0777, true);
            chmod($dir, 0777);
        }
        // Récupération du fichier
        $fic = $_FILES['fic'];
        // Chemin temporaire d'upload
        $temp = IMAGES.'Medias/tmp/' . $fic['name'];
        // Copie du média dans le dossier temporaire.

        if (move_uploaded_file($fic['tmp_name'], $temp)) {
            // Remplissement du tableau data
            $data = array(
                'Media' => array( 'name' => $fic['name'], 'file' => array( 'name' => $fic['name'], 'tmp\_name' => $temp ) ) ); // Récupération du nom du fichier pour la sauvegarde $file = explode('.', $data['Media']['file']['name']); $extention = strtolower(end($file)); $filename = strtolower(Inflector::slug(sha1(implode('.', array\_slice($file,0,-1))) . '-' . time(), '-')); // Sauvegarde en bdd $save = $this->Media->save(array( 'name' => $data['Media']['name'], 'url' => 'Medias/' . date('Y') . '/' . date('m') . '/' . $filename . '.' . $extention, 'type' => 'image', 'post\_id' => $post\_id )); // On vérifie que le fichier a bien été sauvegardé. if ($save) { // Déplacement de l'image copy($data['Media']['file']['tmp\_name'], $dir . DS . $filename . '.' . $extention); // Croopage de l'image foreach(Configure::read('Media.size') as $k => $v) { $size = explode('x', $v); $this->Img->crop($dir . DS . $filename . '.' . $extention, $dir . DS . $filename . '\_' . $k.'.jpg', $size[0], $size[1]); } } else echo "Format du média non supporté."; } else { echo "La copie de l'image dans le dossier temporaire à échouée."; } // Suppression de l'mage temporaire unlink($temp); // Arrèt du script die(); } } ?>[/code]