web-dev-qa-db-fra.com

Pourquoi est-ce que j'obtiens un fichier .csv de type mime comme "application / octet-stream"?

Je travaille sur une application PHP qui doit importer un fichier Excel dans MySQL. J'ai donc besoin de convertir le fichier Excel au format .csv. Mais quand je veux obtenir son type en utilisant $_FILE['something']['type'] , Je reçois application/octet-stream comme son type mime;
Je pense qu'il y a quelque chose qui ne va pas ici. Parce que j'ai rassemblé la liste ci-dessous en tant que fichier MIME de type .csv:

text/comma-separated-values,  
text/csv,  
application/csv, 
application/Excel, 
application/vnd.ms-Excel, 
application/vnd.msexcel

Quel est le problème ?

41
Mohammad Saberi

Dans de tels moments, la spécification HTTP officielle est toujours utile. De RFC 2616 7.2.1 (je souligne):

Tout message HTTP/1.1 contenant un corps d'entité DEVRAIT inclure un champ d'en-tête Content-Type définissant le type de média de ce corps. Si et seulement si le type de média n'est pas donné par un champ Content-Type, le destinataire PEUT tenter de deviner le type de média via l'inspection de son contenu et/ou les extensions de nom de l'URI utilisées pour identifier la ressource. Si le type de support reste inconnu, le destinataire DEVRAIT le traiter comme le type "application/octet-stream" .

La cause de votre problème est que le serveur acceptant le téléchargement de fichier ne sait pas lui-même quel type de fichier a été téléchargé. Pourquoi? Parce qu'il repose sur le message HTTP qui a envoyé le fichier pour spécifier un Content-Type en-tête pour déterminer le type MIME exact. Le navigateur n'a probablement pas envoyé de Content-Type en-tête et le serveur a supposé application/octet-stream selon l'extrait de spécification HTTP officiel ci-dessus. Il est également possible que le client téléchargeant le fichier ait choisi de ne pas déterminer le type MIME du fichier qu'il téléchargeait et ait envoyé le Content-Type: application/octet-stream l'en-tête lui-même.

Maintenant, lorsque nous considérons cela en conjonction avec le entrée manuelle PHP concernant POST uploads de fichiers docs , nous voyons ce qui suit:

$_FILES['userfile']['type']

Le type mime du fichier, si le navigateur a fourni ces informations. Un exemple serait "image/gif". Ce type de mime n'est cependant pas vérifié du côté PHP et donc ne prenez pas sa valeur pour acquise.

Comme vous pouvez le voir, même si $_FILES['userfile']['type'] est spécifié, il ne correspond qu'à Content-Type en-tête envoyé par le client. Ces informations peuvent facilement être truquées et ne doivent pas être utilisées. Si vous devez être bien sûr que le fichier téléchargé est d'un type spécifique, vous devrez le vérifier vous-même.

44
rdlowrey

application/octet-stream est toujours utilisé si le type MIME n'est pas connu.

19
StrubT

$_FILE['something']['type'] est peuplé par le système d'exploitation du navigateur/utilisateur, il n'est donc pas fiable. Vous devez faire votre propre vérification côté serveur pour déterminer si le fichier téléchargé était au format souhaité.

0
dev-null-dweller

Tous les types MIME que vous avez répertoriés apparaissent comme types MIME courants pour les fichiers CSV sur http://filext.com/file-extension/CSV

Donc, fondamentalement, je dirais que cela dépend du programme qui a généré le fichier .csv et du type mime qu'ils ont décidé d'utiliser.

0
chucksmash