PHP forcer téléchargement .xlsx fichier corrompu
Je travaille sur un site qui permet aux enseignants de télécharger les documents et les étudiants de télécharger. Cependant, il y a un problème. Microsoft Word (.docx) téléchargement des fichiers parfaitement, mais lors du téléchargement d'un fichier excel (xlsx) fichier excel donne un "Ce fichier est corrompu et ne peut pas être ouvert" boîte de dialogue. Toute aide à ce serait grandement apprécié!
Mon code de téléchargement comme suit:
case 'xlsx':
header('Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Pragma: no-cache');
readfile('./uploads/resources/courses/' . $filename);
break;
N'importe quel espace en cours de sortie par exemple, avant la balise d'ouverture? Existe-il des mises en garde/avis, ceux qui vont le faire le fichier corrompu. Télécharger le fichier à partir d'une source FTP et de l'ouvrir pour vérifier le fichier d'origine n'est pas corrompu.
Quel est le fichier téléchargé? Est-il vide? Est-il coupé? Dans ce dernier cas, vous pouvez essayer d'envoyer un
Ce qui se passe après cette
L'espace blanc n'affectent pas le fichier sur le serveur.... c'est l'espace ou une NOMENCLATURE ou un écho messages/avertissements/erreurs à partir de votre script qui sont envoyés à php://output avec le fichier lui-même qui est la cause la plus probable
Vraiment confus maintenant! Notepad++ est dit que les deux fichiers de match!
Quel est le fichier téléchargé? Est-il vide? Est-il coupé? Dans ce dernier cas, vous pouvez essayer d'envoyer un
Content-Length
en-tête. Une autre question pourrait être que le téléchargement prend trop de temps et PHP jette un délai d'attente. Utilisation set_timeout()
pour augmenter le délai d'attente.Ce qui se passe après cette
switch
bloc? Habituellement, vous exit;
après l'appel de readfile
.L'espace blanc n'affectent pas le fichier sur le serveur.... c'est l'espace ou une NOMENCLATURE ou un écho messages/avertissements/erreurs à partir de votre script qui sont envoyés à php://output avec le fichier lui-même qui est la cause la plus probable
Vraiment confus maintenant! Notepad++ est dit que les deux fichiers de match!
OriginalL'auteur cbenjafield | 2012-12-18
Vous devez vous connecter pour publier un commentaire.
cela fonctionne très bien sur mon local xampp installation quelle que soit l'extension donc, de mon point de vue aucun cas, la déclaration est nécessaire sauf si je suis absent quelque chose
j'ai testé avec docx, accdb, xlsx, mp3, rien ...
comment conservez-vous vos fichiers? avez-vous changer leurs noms ou leurs extensions? si vous essayez d'ouvrir un fichier que vous connaissez pour sûr que c'est xlsx , il vous donne l'erreur, ok , mais comment voulez-vous enregistrer les fichiers sur votre serveur en premier lieu ?
Ok, l'utilisateur télécharge le fichier, le script prend le
$_FILES['resource']['name']
supprime l'extension, remplace les espaces par des underscores, ajoute un nombre à quatre chiffres et ajoute l'extension. C'est alors passé de tmp_name le nouveau chemin d'accès à l'aidemove_uploaded_file()
. Cependant, lorsque je vais dans le chemin de téléchargement du dossier sur le serveur, le nouveau téléchargé le fichier s'ouvre bien, c'est seulement lorsqu'il est téléchargé qu'il se casse.J'ai enlevé le traitement du nom de fichier et maintenant, il stocke le fichier d'origine dans le dossier maintenant. J'ai enlevé le bloc de commutateurs, mais il a repris le court message d'erreur.
même si vous supprimez readfile()?
OriginalL'auteur cristi _b
J'ai ce problème et a été le BOM.
Comment avis il
décompresser: Vérification du fichier de sortie avec le décompresser, j'ai vu un message d'avertissement lors de la deuxième ligne.
xxd (hex viewer): j'ai vu les 5 premiers octets avec la commande suivante
Avis les 3 premiers octets
ef bb bf
que BOM!Pourquoi?
Peut-être un fichier php avec la NOMENCLATURE ou d'une précédente sortie à partir d'une bibliothèque.
Vous devez trouver où se trouve le fichier de commande ou avec la NOMENCLATURE, Dans mon cas, et maintenant, je n'ai pas de temps pour le trouver, mais je résoudre ce avec tampon de sortie.
OriginalL'auteur Felipe Buccioni
essayez ceci:
.xlsx
, cependant. stackoverflow.com/a/4212908/206403Cela ne fait aucune différence.
OriginalL'auteur GabCas
essayer:
OriginalL'auteur N. Peters
Essayez d'ajouter un en-tête supplémentaire
OriginalL'auteur Roland