2009-08-19 8 views
0

J'ai une application asp.net où les utilisateurs peuvent télécharger des fichiers dans notre base de données.Obtention d'une extension de fichier et d'un type de contenu incorrects lors du téléchargement du fichier

Parfois, quand ils téléchargent les fichiers, le content-type est défini comme "application/octet-stream" qui est un fichier binaire.

Lorsque je demande à l'utilisateur, ils disent qu'ils ont téléchargé, ils disent qu'il s'agissait d'un fichier .tif. D'une certaine manière, le contrôle de téléchargement le définit comme "application/octet-stream".

Lorsque je télécharge le même fichier .tif à partir de mon ordinateur, il le télécharge avec le type de contenu correct (application/octet-stream).

J'utilise le code suivant pour obtenir l'extension de fichier

fileExtension = filUpload.PostedFile.FileName.Substring(filUpload.PostedFile.FileName.LastIndexOf(".") + 1) 

parfois, il retourne l'extension de fichier comme "c:\documen" ou "j:\testing" etc. Je sais que les fenêtres ne permet pas de caractères spéciaux dans le nom du fichier.

+1

d'abord, ne pas réinventer la roue, utilisez System.IO.Path.GetExtension pour obtenir l'extension – BlackTigerX

+1

secondes, vous évoquez « application/octet-stream » à la fois, la bonne et la mauvaise valeur – BlackTigerX

Répondre

3

Vous ne pouvez simplement pas compter sur le navigateur pour soumettre un type de média MIME utilisable. Il se peut que l'ordinateur client ne dispose d'aucune information de type de média configurée pour un type de fichier particulier (ce qui est probablement le cas pour TIFF ici) ou ne supporte pas du tout les types de média, ou il peut y avoir des bugs dans le passé avec IE).

Vous ne pouvez pas non plus compter sur le navigateur pour soumettre une extension de nom de fichier utilisable. L'ordinateur client ne peut pas utiliser les extensions de fichier pour déterminer le type du fichier. (En effet, Mac et Linux moderne utilisent plusieurs mécanismes pour déterminer le type, toute extension de nom de fichier peut être trompeuse, si elle est présente.)

D'ailleurs, vous ne pouvez même pas compter sur le navigateur pour soumettre un nom de fichier utilisable en premier lieu! Tous les systèmes d'exploitation n'utilisent pas de barre oblique inverse et de point pour les séparateurs de répertoire et d'extension. le nom de fichier soumis est effectivement une chaîne opaque que vous pouvez utiliser pour deviner certains des cas courants, mais vous ne pouvez pas considérer comme définitif.

Ainsi, les seuls moyens raisonnables pour déterminer le type d'un fichier téléchargé sont:

  1. Demandez à l'utilisateur explicitement quel type ils sont le téléchargement. Essayez de deviner de quel type il s'agit dans le type de fichier et le nom de fichier final, revenez en demandant à l'utilisateur de quel type il s'agit. Si les types que vous voulez autoriser sont tous ceux avec des en-têtes renifleurs (comme le format TIFF et la plupart des autres formats d'image), vous pouvez déterminer le type en regardant le contenu du fichier.

2

Utilisez les fonctions de l'espace de noms System.IO pour les analyser à la place.

Pour obtenir l'extension, vous feriez ceci:

fileExtension = System.IO.Path.GetExtension(filUpload.PostedFile.FileName);
1

Je crois que le navigateur de l'utilisateur envoie un type MIME déclaré avec le fichier. Il appartient ensuite au navigateur de déclarer le type du fichier. Différents navigateurs peuvent avoir des capacités différentes pour déduire le meilleur type MIME d'un fichier. Lorsque vous obtenez le fichier sur votre serveur, vous pouvez simplement vérifier l'extension .tif [f] - c'est probablement toute la vérification que le navigateur de téléchargement fera de toute façon.

+0

le problème est le fichier téléchargé n'a pas besoin d'être fichier .tif. ce peut être pdf, mot, fichier de texte etc. – Sridhar

Questions connexes