2013-04-16 1 views
44

Je télécharge le fichier en utilisant l'option de téléchargement de fichier. Et j'envoie directement ce fichier de View au contrôleur dans la méthode POST comme,ASP.Net MVC - Lire le fichier à partir de HttpPostedFileBase sans enregistrer

[HttpPost] 
    public ActionResult Page2(FormCollection objCollection) 
    { 
     HttpPostedFileBase file = Request.Files[0]; 
    } 

On suppose, je télécharger un fichier de bloc-notes. Comment puis-je lire ce fichier & ajouter ce texte au constructeur de chaîne, sans enregistrer ce fichier ....

Je suis au courant de après SaveAs ce fichier, nous pouvons lire ce fichier. Mais comment puis-je lire ce fichier de HttpPostedFileBase sans enregistrer?

Répondre

62

Cela peut être fait en utilisant httpPostedFileBase classe retourne la HttpInputStreamObject selon spécifié here

Vous devez convertir le flux en tableau d'octets et vous pouvez lire le contenu du fichier

S'il vous plaît consulter le lien suivant

http://msdn.microsoft.com/en-us/library/system.web.httprequest.inputstream.aspx]

Hope this helps

MISE À JOUR:

Le flux que vous obtenez de votre appel HTTP est en lecture seule séquentielle (non adressable) et FileStream est en lecture/écriture adressable. Vous devrez d'abord lire le flux entier de l'appel HTTP dans un tableau , puis créer le FileStream à partir de ce tableau.

Taken de here

// Read bytes from http input stream 
BinaryReader b = new BinaryReader(file.InputStream); 
byte[] binData = b.ReadBytes(file.ContentLength); 

string result = System.Text.Encoding.UTF8.GetString(binData); 
+1

http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers –

+4

post-scriptum b.ReadBytes() veut un int, mais file.InputStream.Length est une longue –

+2

mais file.InputStream.ContentLength est un int –

34

Une alternative est d'utiliser StreamReader.

public void FunctionName(HttpPostedFileBase file) 
{ 
    string result = new StreamReader(file.InputStream).ReadToEnd(); 
} 
+0

ce videra le stream making file.Length = 0 – PUG

+3

convenu, mais dans de nombreux cas, c'est OK. –

+2

Bien que +1, vous ne disposez pas d'un 'IDisposable'. –

5

Un léger changement de Thangamani Palanisamy réponse, ce qui permet au lecteur binaire à éliminer et corrige le problème de longueur d'entrée dans ses commentaires.

string result = string.Empty; 

using (BinaryReader b = new BinaryReader(file.InputStream)) 
{ 
    byte[] binData = b.ReadBytes(file.ContentLength); 
    result = System.Text.Encoding.UTF8.GetString(binData); 
} 
Questions connexes