2010-07-27 4 views
4

Quoi qu'il en soit, j'essaie de télécharger un fichier depuis le navigateur, puis de le lire dans un objet XmlDocument sur le serveur. À l'origine, j'ai craqué cela en sauvegardant le fichier sur le disque, en le lisant dans l'objet XmlDocument, puis en supprimant le fichier. Le seul problème était que l'action de suppression essayait d'avoir lieu avant que l'action XmlDocument.Load soit terminée. De toute façon, c'était comme une solution laide, alors c'était heureusement abandonné.Chargement du fichier XML envoyé dans l'objet XmlDocument

Ensuite, l'effort était de lire directement à partir du Request.Files[x].InputStream directement dans le XmlDocument, mais j'ai des problèmes. Le code suivant échoue avec un

« élément racine est manquant »

Je sais que le XML est valide il doit être autre chose.

foreach (string file in Request.Files) 
{ 
    HttpPostedFileBase postedFile = Request.Files[file] as HttpPostedFileBase; 

    if (postedFile.ContentLength > 0) //if file not empty 
    { 
     //create an XML object and load it in 
     XmlDocument xmlProjPlan = new XmlDocument(); 

     Stream fileStream = postedFile.InputStream; 
     byte[] byXML = new byte[postedFile.ContentLength]; 
     fileStream.Read(byXML, 0, postedFile.ContentLength); 
     xmlProjPlan.Load(fileStream); 
    } 
} 

Répondre

9

Voici un exemple:

<% using (Html.BeginForm("index", "home", FormMethod.Post, new { enctype = "multipart/form-data" })) { %> 
    <input type="file" name="file" /> 
    <input type="submit" value="Upload" /> 
<% } %> 

Et l'action du contrôleur:

[HttpPost] 
public ActionResult Index(HttpPostedFileBase file) 
{ 
    if (file != null && file.ContentLength > 0 && file.ContentType == "text/xml") 
    { 
     var document = new XmlDocument(); 
     document.Load(file.InputStream); 
     // TODO: work with the document here 
    } 
    return View(); 
} 
+0

Merci pour la note sur la validation ContentType - me sauve l'essayer et attraper le code que j'avais mis en place pour cela. – JonRed

+0

Hey mec; Merci pour la réponse que cela m'a aidé .... Mais j'ai copié et collé votre code et a été passé quelques heures pourquoi ne fonctionne pas. J'ai finalement trouvé que vous avez écrit: "mutipart" au lieu de "multipart". Si vous éditez ce post serait bien pour les autres. – freewill

+0

@freewill, bon endroit. J'ai mis à jour ma réponse. Merci de l'avoir signalé. –

4

donc quelques choses semblent mal.

fileStream.Read(byXML, 0, postedFile.ContentLength); 

Cette ligne lit le fichier dans le tampon d'octets byXML, mais vous n'êtes pas en utilisant ce tampon d'octets plus tard, donc je pense que vous vouliez supprimer cette ligne ou utiliser le tampon de byXML pour votre XmlDocument.Load() au lieu du fileStream.

Cette ligne progresse malheureusement, votre flux à la fin, de sorte que lorsque vous appelez

xmlProjPlan.Load(fileStream); 

Il se fait rien parce que le cours d'eau est déjà à la fin. C'est probablement pourquoi il ne peut pas trouver un élément racine.

+0

brillant. Merci pour ça. Cela a du sens et je me suis demandé à ce sujet. C'est ce que vous obtenez de copier-coller à l'aveugle à partir d'un exemple de code dont vous n'êtes pas sûr. – JonRed

Questions connexes