Простая форма загрузки / выгрузки в ASP.NET MVC - PullRequest
0 голосов
/ 31 октября 2009

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

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

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

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

1 Ответ

3 голосов
/ 31 октября 2009

Чтобы выполнить загрузку, вам понадобится файл ввода и форма, которая использует энтип 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" );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...