2010-01-04 7 views
5

J'utilise la balise <input type="file" /> pour télécharger un fichier sur le serveur. Comment accéder au fichier côté serveur et le stocker sur le serveur? (Le fichier est un fichier image)Accès au fichier de type d'entrée côté serveur dans asp.net

Le code côté client est:

<form id="form1" action="PhotoStore.aspx" enctype="multipart/form-data"> 
    <div> 
    <input type="file" id="file" onchange="preview(this)" /> 
    <input type="submit" /> 
    </div> 
</form> 

Photostore.aspx.cs a

protected void Page_Load(object sender, EventArgs e) 
     { 
      int index = 1; 
      foreach (HttpPostedFile postedFile in Request.Files) 
      { 
       int contentLength = postedFile.ContentLength; 
       string contentType = postedFile.ContentType; 
       string fileName = postedFile.FileName; 

       postedFile.SaveAs(@"c:\test\file" + index + ".tmp"); 

       index++; 
      } 

     } 

J'ai essayé de télécharger un fichier jpg. Impossible de voir un fichier enregistré. Qu'est-ce qui ne va pas?

+0

winforms ou mvc ou autre? –

Répondre

0

Regardez dans le contrôle ASP: FileUpload fourni par ASP.NET.

6

Vous aurez besoin d'ajouter id et runat="server" attributs comme ceci:

<input type="file" id="MyFileUpload" runat="server" /> 

Ensuite, sur le côté serveur, vous aurez accès à la propriété PostedFile du contrôle, qui vous donnera ContentLength, ContentType, FileName, InputStream propriétés et une méthode etc SaveAs:

int contentLength = MyFileUpload.PostedFile.ContentLength; 
string contentType = MyFileUpload.PostedFile.ContentType; 
string fileName = MyFileUpload.PostedFile.FileName; 

MyFileUpload.PostedFile.Save(@"c:\test.tmp"); 

Sinon, vous pouvez utiliser Request.Files wh ich vous donne une collection de tous les fichiers téléchargés:

int index = 1; 
foreach (HttpPostedFile postedFile in Request.Files) 
{ 
    int contentLength = postedFile.ContentLength; 
    string contentType = postedFile.ContentType; 
    string fileName = postedFile.FileName; 

    postedFile.Save(@"c:\test" + index + ".tmp"); 

    index++; 
} 
+0

pourquoi runat = "serveur"? Je ne veux pas de contrôle de serveur. Est-ce que cela fonctionnera sans contrôle de serveur? – Ajay

+3

Si vous ne voulez pas utiliser un contrôle serveur, vous pouvez utiliser 'Request.Files', ce qui vous donnera une collection contenant un objet' HttpPostedFile' pour chaque fichier téléchargé. – LukeH

+0

Merci beaucoup @LukeH ... Vous m'avez tiré d'affaire ... :) –

0

Si vous ne voulez pas utiliser le contrôle FileUpload dans la boîte à outils, donnez votre entrée une carte d'identité puis utilisez la forme [id] pour accéder au champ de saisie et de le jeter aux HtmlInputFile.

exemple ici: http://www.codeproject.com/KB/aspnet/fileupload.aspx

0

Si vous donnez l'entrée étiquette un identifiant et ajoutez le runat = « server » attribut, vous pouvez y accéder facilement.
d'abord changer votre balise d'entrée: <input type="file" id="FileUpload" runat="server" />
Ensuite, ajoutez la ligne suivante à votre méthode Page_Load:

if (FileUpload.PostedFile != null) 
{ 
    FileUpload.PostedFile.SaveAs(@"some path here"); 
} 

Cela écrire votre fichier dans un dossier de votre choix. Vous pouvez accéder à l'objet FichierFichier si vous devez déterminer le type de fichier ou le nom de fichier d'origine.

2

Je pense que l'étiquette de nom est nécessaire à l'entrée du fichier:

<input type="file" name="file" /> 

Sans cela, je ne reçois rien de nouveau.


D'autres problèmes que j'avais qui pourrait être spécifique à ma machine:

je reçois un

Unable to cast object of type 'System.String' to type 'System.Web.HttpPostedFile'. 
erreur

à la ligne

foreach (HttpPostedFile postedFile in Request.Files) 

donc mon apparence de code final comme ceci:

for (var i = 0; i < Request.Files.Count; i++) 
{ 
    var postedFile = Request.Files[i]; 

    // do something with file here 
} 
Questions connexes