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
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().
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.