2009-10-31 5 views
0

Я начинаю работу с ASP.NET MVC, но хочу продолжить изучение. Я прошел обычные примеры «привет, мир», и теперь я хотел бы попробовать что-то более сложное. В частности, я хочу, чтобы иметь возможность:Простая форма загрузки/загрузки в ASP.NET MVC

  • загрузить некоторые XML-файл,
  • сделать некоторую простую обработку на ней, а затем
  • позволяет пользователю загрузить новый файл с результатами обработки

В этом случае обработка, которую я хотел бы сделать, является чем-то тривиальным, что доказывает, что я действительно получил XML-файл и рассмотрел его. Например, достаточно подсчета количества элементов <basket>. После обработки я хотел бы передать результаты в виде нового файла пользователю (скажем, текстовый файл, который содержит только предложение «Было 398 <basket> элементов»), чтобы их браузер начал загрузку.

Какой хороший общий подход для этого?

ответ

2

Чтобы сделать загрузку, вам понадобится входной файл и форма, использующая enctype multipart/form-data. На сервере вы получаете объект HttpPostedFileBase из элемента коллекции Request.Files, соответствующего имени тега вашего ввода. Затем вы получаете доступ к потоку в файловом объекте и читаете его.

Как только у вас есть данные, вы выполняете свою трансформацию - здесь вы читаете счетчик определенного тега. Затем вы хотите вернуть FileResult из своего действия. Поскольку это действительно просто строка, я бы предложил записать ее в MemoryStream, а затем перемотать эту строку и создать FileResult из нее.

<% using (Html.BeginForm("Upload","Controller",FormMethod.Post, new { enctype = "multipart/form-data")) 
    { %> 
    <label for="uploadFile">File:</label> 
    <input type="file" name="uploadFile" id="uploadFile" /> 
    <input type="submit" value="Upload" /> 
<% } %> 

код - так как я предполагаю, что вы будете в конечном итоге хотят сделать что-то более сложное, я буду включать некоторые (непроверенный/некомпилированный) код, который делает то, что вы описали (я думаю).

public ActionResult Upload() 
{ 
    var file = Request.Files["uploadFile"]; 
    if (file == null) 
    { 
     ModelState.AddModelError("uploadFile", "No file specified"); 
     return View(); 
    } 

    var reader = new StreamReader(file.InputStream); 

    var doc = XDocument.Load(reader); 

    var count = doc.Descendants().Where(n => n.Name == "basket").Count(); 

    var output = new MemoryStream(); 
    var writer = new StreamWriter(output); 

    writer.Write("{0} baskets", count); 
    output.Seek(0, SeekOrigin.Begin); 

    return File(output, "text/plain", "count.txt"); 
} 
+0

Это замечательно! Я собираюсь попробовать это, как только вернусь с обеда. Спасибо за вашу помощь. –

Смежные вопросы