Ouvrir un fichier word en php

Eléphanteau du PHP | 19 Messages

31 août 2012, 15:57

Bonjour,

Le script php ci-desous me permet d'ouvrir un document word existant contenu dans un dossier.

Mais quand il ouvre le fichier word, voit des caractère assez-bizarre, autre que ceux qui figurent

sur mon fichier d'origine, mais les 2 documents (celui téléchargé et l'original figurant dans le repertoire

du serveur) portent le même nom.

Voici le code :

<?php


$path ="protocoles/";
$fullPath = $path.$_GET['download_file'].".doc";

echo $fullPath;

if ($fd = fopen ($fullPath, "r")) {
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
case "doc":
header("Content-type: application/msword");
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
break;
default;
header("Content-type: application/octet-stream");
header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
}
header("Content-length: $fsize");
header("Cache-control: private"); //use this to open files directly
while(!feof($fd)) {
$buffer = fread($fd, 1024);
echo $buffer;
}
}
fclose ($fd);
exit;
?>

Aidez-moi à corriger ce bugg

Mammouth du PHP | 2278 Messages

02 sept. 2012, 08:51

Le format doc de word est un format propriétaire que word et open office savent lire.
fread lit effectivement ce fichier, y compris les marques de mise en forme quite semblent être des bugs.
Ce serait la même chose avec un fichier odt de open office.
Il suffit de mettre un lien et de prier que la machine client ait un word ou un ofice installé pour que ça fonctionne.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

ViPHP
ViPHP | 2577 Messages

03 sept. 2012, 08:47

Bonjour,

Il me semble que fread() supprime les passages à la ligne \n et \r\n d'ou le problème. Essayes avec une autre fonction qui lit vraiment le fichier sans interprétation comme file_get_content(), fgetc() ou readfile(). De mémoire, je te conseille readfile().

Mammouth du PHP | 2278 Messages

03 sept. 2012, 09:47

1)
a Le risque avec fread, en spécifiant une taille à lire, est qu'il tronque une ligne, un mot ou un marqueur.
b fgets lit ligne par ligne en se fiant aux caractères de fin de ligne, mais, dans un traitement de texte, je doute que le retour visuel à la ligne soit marqué par un caractère \nl qui sert probablement de fin de paragraphe.
2) Si un fichier peut être lu et affiché correctement par echo ou print de php, il peut être affiché correctement par le cat de unix. Au cas où je n'aurais pas été clair le fichier contenant:
php
france
enregistré au format .doc fait 9216 octets pour 9 lettres + 2 fins de ligne et 1 fin de fichier. Le reste est du code ajouté par Micromou au milieu duquel on trouve le texte....
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

ViPHP
ViPHP | 2577 Messages

03 sept. 2012, 10:02

En fait, je ne sais pas pourquoi il y aurai le caractère \n dans un fichier word, mais ce n'est pas impossible. Avec l'utilisation de fread() on perd ce caractère et donc le contenu du fichier est modifier.

C'est le même problème avec tout fichier. Pour un fichier texte, il faut remettre le /n dans l'écho et encore, on ne sait pas s'il y avait \n ou \r\n.

Edit : J'ai ouvert un document word "vide". J'ai trouvé 7 lignes (renommé en .html et affichage du source - pas d'autre outils sous la main)

Mammouth du PHP | 2278 Messages

03 sept. 2012, 15:09

Il est évident qu'il ne faut pas manipuler un fichier word (doc),openoffice (odt),.. avec fread qui, visiblement est conçu pour des fichiers textes sans finesses.
Une solution serait d'aller voir du côté des mime-types et de créer un lien, comme on fait d'ailleurs pour les .pdf les sons ou les vidéos.
Une exception serait les .rtf si on voulait les exploiter.
Quant à fread, son problème n'est pas de savoir s'il supprime les fins de lignes, mais de savoir ce qui se passe avec les limites en nombre de caractères : sur un fichier inconnu, il n'y a aucune raison de fixer une longueur, ce que php résout en proposant fgets...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

ViPHP
ViPHP | 2577 Messages

03 sept. 2012, 15:52

A mon avis, le plus simple est :
<?PHP
header("Content-type: application/msword");
readfile('fichier.doc');
?>