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


Tit-LoW
Auteur
Réponse acceptée

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]

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é.

++

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

Tit-LoW
Auteur

@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.

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
Auteur

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.

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
Auteur

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é.