2009-03-10 8 views
0

J'ai un contrôle FileUpload (FileUpload1) sur mon formulaire Web, ainsi qu'un bouton "Sumbit", une étiquette et un champ caché qui contient un UserID. J'ai le code suivant dans l'événement de clic du bouton:FileUpload - Vérification qu'un fichier réel a été téléchargé

string path = Server.MapPath("~/userfiles/"); 

if (FileUpload.HasFile) 
{ 
    try 
    { 
     FileUpload1.SaveAs(path + UserID.Value + "/image.jpg"); 
    } 
    catch 
    { 
     Label1.Text = "* unable to upload file"; 
     Label1.Visible = true; 
    } 
} 

Cela fonctionne très bien si je télécharge un fichier réel. Toutefois, si je tape un nom de fichier inexistant (par exemple, "c: \ a.jpg", qui n'existe pas sur mon ordinateur) dans la zone de texte de FileUpload, et cliquez sur le bouton Sumbit, HasFile renvoie toujours la valeur true. De plus, SaveAs() ne lance aucune exception, et c'est une fonction vide qui ne renvoie aucune valeur indiquant le succès ou l'échec. Comment savoir si un fichier a été téléchargé?

Répondre

7

Vérifiez simplement s'il existe.

if(File.Exists(myFile)){ 
    //it was uploaded. 
} 
2

Vous pouvez vérifier si le fichier existe en utilisant File.Exists avant d'appeler SaveAs.

3

Vous pouvez vérifier FileUpload.PostedFile.ContentLength propriété

1

Hmmm ....

Je ne sais pas, je comprends. D'abord, dans votre code, FileUpload.HasFile ne compilera pas. Si devrait être FileUpload1.HasFile.

Quand je corrige cela, et exécutez votre code, cette ligne retourne false si le fichier n'existe pas ...

Vous pouvez vérifier si le fichier existe après le téléchargement en utilisant File.Exists (chemin); L'objet fichier fait partie de System.IO.

1

Il ne s'agit pas de votre question actuelle, mais vous devez valider toute saisie utilisateur, en particulier si vous souhaitez que les utilisateurs téléchargent des fichiers dans un dossier virtuel sur votre serveur Web. Vous devriez au moins vérifier si le type de contenu du fichier est celui que vous attendez, ou - mieux encore, filtrer (redimensionner) l'image en utilisant les classes disponibles dans le framework .NET. Si vous ne le faites pas, les utilisateurs peuvent partager du contenu arbitraire via votre site ou placer des fichiers malveillants (par exemple, des images contenant un script pouvant être exécuté par certains navigateurs Web) sur votre serveur.

Avec une validation supplémentaire, vous pourrez également valider si du contenu a effectivement été envoyé.

ET: Une vulnérabilité très sévère s'ouvre lorsque vous construisez le chemin de sauvegarde en concaténant l'entrée d'un champ de formulaire (je suppose que UserID.Value est le paramètre POST que vous mentionnez?). Cela permet aux utilisateurs de décider où stocker le contenu sur votre serveur, et, pire encore, être en mesure d'écraser les fichiers existants!

Questions connexes