Не удается загрузить файлы с ASP.NET MVC2 - PullRequest
4 голосов
/ 24 июня 2010

Я установил для enctype: multipart / form-data, пока я отправляю эту форму, Request.ContentType имеет вид: application / x-www-form-urlencoded, и содержимое загрузки не может быть получено из запроса. .files.

Вот мой взгляд:

    <% using (Html.BeginForm("Import", "Content", FormMethod.Post, new { enctype = "multipart/form-data" })) { %>

<p>
    <%= Html.CheckBox("DeleteExisting")%> Delete Existing Records?
</p>   

<p>
    <input type="file" name="FileUpload" id="FileUpload" /> Select a dump file.
</p>

<p>
    <input type="submit" value="Import Now" />
</p>

<% } %>

Вот мое действие:

        [HttpPost]
    public ActionResult Import(FormCollection fc)
    {
        string chkDelete = fc["DeleteExisting"];
        //string filename = fc["FileUpload"];

        if (!chkDelete.Equals("false"))
        {
            //TODO: delete existing records, if specified
        }


        var inputFile = Request.Files["FileUpload"];


        return View();
    }

В PostBack переменная "fc" заполнена, и я могу получить доступ к значению флажка и получить имя файла для загрузки.

Почему мой энктип будет игнорироваться?

Я пытался вручную поместить тег формы в представление с атрибутами в разных позициях, но это не имело значения.

Единственное, что я могу подумать, это то, что эта форма импорта вложена в форму MasterPage, но, похоже, это не должно быть проблемой. Кроме того, я правильно приложил эту форму.

Есть предложения?

1 Ответ

4 голосов
/ 24 июня 2010

Я полагаю, что здесь есть две проблемы:

Единственное, что я могу думать, это то, что эта форма импорта вложена в форму MasterPage, но это не такпроблема.Кроме того, эта форма прилагается надлежащим образом.

Это, вероятно, большая часть проблемы - меня беспокоит две вещи:

  1. Вложенные формы не являются законными (X)HTML - браузеру вполне законно разрешено игнорировать второе объявление формы и закрывать форму в первом теге формы, к которому он относится - так что это вполне может быть проблемой, с которой вы столкнулись.
  2. Поскольку мыЧто касается ASP.NET MVC, нет никакой причины иметь одну большую вложенную форму на главной странице, это только помешает (как мы, возможно, видим здесь).

Я рекомендую вам удалить форму с главной страницы и просто добавить их, когда они вам понадобятся, вокруг реальной формы.Это также может решить проблему, с которой вы столкнулись.

Во-вторых, вам нужно добавить параметр, основанный на HttpPostedFileBase, к вашему действию:

public ActionResult Import(FormCollection fc, HttpPostedFileWrapper FileUpload)
{
  string chkDelete = fc["DeleteExisting"];

  if (null != FileUpload && 0 < FileUpload.ContentLength) {
   // We have an upload.

   string filename = FileUpload.FileName;

    if (!chkDelete.Equals("false"))
    {
        //TODO: delete existing records, if specified
    }

    // Stream file in from FileUpload.InputStream e.g.:
    var bytesOriginal = new byte[FileUpload.ContentLength];
    FileUpload.InputStream.Read(bytesOriginal, 0, FileUpload.ContentLength);

    //Read from the byte array as you would any normal file.
  }

  return View();
}

Я только что попробовал это в простом виде (без главной страницы, без вложенных форм), и он вел себя точно так, как я и ожидал - без HttpPostedFileWrapper, FormCollection содержала только флажок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...