Page 1 sur 1

Pièce jointe dans messagerie interne

Posté : 10 juil. 2014, 13:29
par moimeme30
Bonjour,

Je suis en train de réaliser une messagerie interne à mon site.
Il y a la possibilité pour l'utilisateur d'envoyer des pièces jointes de différente nature (xls, doc, txt, jpg, pdf, etc...)
Pour les fichiers txt et pdf ca fonctionne, par contre les fichiers png, xls etc sont téléchargés mais pas utilisables (png => La galerie de photos ne peut ouvrir cette photo..., xls => encodage bizarre etc...)
Voici mon code:
session_start();

//var_dump($_POST['piece_jointe'],file_exists('pieces_jointes/'.$_POST['piece_jointe']),filesize('pieces_jointes/'.$_POST['piece_jointe']));die();
 
if (isset($_POST['id']) AND isset($_POST['piece_jointe']) AND isset($_POST['token_lect_mess']) ) {
    if($_SESSION['token_lect_mess'] == $_POST['token_lect_mess']) {
     
            $piece_jointe = $_POST['piece_jointe'];    
                header('Content-type: application/force-download');
                header('Content-Disposition: attachment; filename="'.$piece_jointe.'"');
                readfile('pieces_jointes/'.$piece_jointe.'');
    }
    else {
        header ("Refresh: 1;URL=index.php");
        echo "<div class='apres_valid'>Token erroné.</div>";
    }
}
else{
header ("Location: index.php");
}
Quelqu'un a une idée svp?

Re: Pièce jointe dans messagerie interne

Posté : 10 juil. 2014, 16:46
par Elie
Bah pour afficher une image tu uilises du HTML avec la balises <img /> et les navigateur n'affiche pas les fichiers Excel sur une page ...
Donc c'est un peu compliqué ce que tu nous demande ... Ta logique est pas bonne quoi.

Re: Pièce jointe dans messagerie interne

Posté : 10 juil. 2014, 17:00
par moimeme30
Je ne veux pas ouvrir la pièce jointe, je désire forcer le téléchargement.
D’où le script

Re: Pièce jointe dans messagerie interne

Posté : 10 juil. 2014, 17:46
par Elie
Ah ! Regarde ici : http://fr.openclassrooms.com/informatiq ... e-fichiers
<?php
function telecharger_fichier($fichier)
{
 $chemin = 'fichiers/' . $fichier;
 $images_ext = array('jpg', 'jpeg', 'png', 'bmp', 'gif');
 if(file_exists($chemin))
 {
  $image_format = substr(strrchr($chemin, '.'), 1);
  if(in_array($image_format, $images_ext))
   header('Content-Type: image/' . $image_format);
  else
  {
   header('Content-Description: File Transfer');
   header('Content-Type: application/octet-stream');
   header('Content-Disposition: attachment; filename=' . basename($chemin));
   header('Content-Transfer-Encoding: binary');
   header('Expires: 0');
   header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
   header('Pragma: public');
   header('Content-Length: ' . filesize($chemin));
  }
  readfile($chemin);
  exit;  
 }
 else
  require('erreur.php');
}
?>

Re: Pièce jointe dans messagerie interne

Posté : 10 juil. 2014, 18:27
par moimeme30
Merci Elie,
J'ai essayé ton code ainsi que celui du tuto, mais je me retrouve avec le même probleme.
Dès que le format du fichier est xls, doc, png... ca ne fonctionne pas.
Parc contre, les fichiers txt et pdf sont téléchargés.

Re: Pièce jointe dans messagerie interne

Posté : 10 juil. 2014, 20:01
par Elie
Moi je change le type pour chaque extension ... Essaye
	// on essaie de reconnaitre l'extension pour que le téléchargement corresponde au type de fichier afin d'éviter les erreurs de corruptions
	switch(strrchr(basename($_GET['fichier']), ".")) {
	
		case ".gz": $type = "application/x-gzip"; break;
		case ".tgz": $type = "application/x-gzip"; break;
		case ".zip": $type = "application/zip"; break;
		case ".pdf": $type = "application/pdf"; break;
		case ".png": $type = "image/png"; break;
		case ".gif": $type = "image/gif"; break;
		case ".jpg": $type = "image/jpeg"; break;
		case ".txt": $type = "text/plain"; break;
		case ".htm": $type = "text/html"; break;
		case ".html": $type = "text/html"; break;
		default: $type = "application/octet-stream"; break;
	
	}
	
	header("Content-disposition: attachment; filename=".$_GET['fichier']);
	header("Content-Type: application/force-download");
	header("Content-Transfer-Encoding: ".$type."\n"); // Surtout ne pas enlever le \n
	header("Content-Length: ".filesize($chemin.$_GET['fichier']));
	header("Pragma: no-cache");
	header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
	header("Expires: 0");
	readfile($chemin.$_GET['fichier']);

Re: Pièce jointe dans messagerie interne

Posté : 10 juil. 2014, 20:30
par moimeme30
J'ai essayé mais ca plante encore.
d'ailleurs, quand je teste Content-Type:image/png sur un fichier png le téléchargement fonctionne mais l'image n'apparait pas.
Peut etre que j'ai un soucis au niveau de la base de données.
j'enregistre image.png dans la colonne piece_jointe.
faut il séparer le nom et l'extension?