Попытка загрузить файл с ASP.NET MVC - PullRequest
5 голосов
/ 05 апреля 2009

Я пытаюсь загрузить файл с ASP.NET MVC.

Следующий код прекрасно работает:

// Read in the image data.
byte[] binaryData = null;
HttpPostedFileBase uploadedFile = Request.Files["ImageFileName"];
if (uploadedFile != null &&
    uploadedFile.ContentLength > 0)
    {
        binaryData = new byte[uploadedFile.ContentLength];
        uploadedFile.InputStream.Read(binaryData, 
                                      0,
                                      uploadedFile.ContentLength);
    }

Но я пытаюсь использовать новую FileCollectionModelBinder, найденную в сборке futures .

Я нашел эти два сообщения в блоге здесь и здесь , объясняющих, что делать. Я следую этим инструкциям, но мне не повезло -> объект file всегда null.

Вот мой метод.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Include = "Subject, Content")]
                           Post post, 
                           HttpPostedFileBase file)
{
    UpdateModel(post);
    ...
}

Обратите внимание, как я пытаюсь загрузить файл и загрузить некоторую информацию о сообщении в объект Post.

Кто-нибудь может сделать какие-либо предложения?

Для справки, я подключил ModelBinder в моем global.asax.cs. Я также удостоверился, что форма - сообщение с добавленным enctype: -

<form method="post" enctype="multipart/form-data" action="/post/create">

Ответы [ 4 ]

10 голосов
/ 05 апреля 2009

Не кровавый путь: (

Я понял этот ответ, и он довольно отстойный.

У меня должен был быть аргумент NAME , идентичный значениям Id / Name элемента input type = "file" !!! (не уверен, что это одно или оба значения элемента ... я не проверял этот бит).

так что это ответ.

Элемент ввода Html. (обратите внимание на значение Id / Name)

<input type="file" id="imageFileName" name="imageFileName" class="upload" />

Метод контроллера

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Include = "Subject, Content")]Post post,
    HttpPostedFileBase imageFileName)
{
...
}

shees!

5 голосов
/ 06 апреля 2009

Помните, что вам также нужно открыть форму следующим образом:

<form enctype="multipart/form-data" ...
1 голос
/ 11 ноября 2009

Не уверен, относится ли это к вопросу, но я только что нашел способ получить привязку модели для работы HttpPostedFileBase в сложных объектах. К сожалению, мне пришлось внести изменения в исходный код ASP.NET MVC, так что это не для всех.

В System.Web.Mvc.ValueProviderDictionary.PopulateDictionary () поставщик значений заполняется содержимым Request.Form, Request.QueryString и RouteData, но НЕ Request.Files. Добавьте следующие строки, чтобы «исправить» это (я говорю «исправить», потому что может быть причина, по которой команда ASP.NET MVC не сделала этого в первую очередь).

HttpFileCollectionBase files = ControllerContext.HttpContext.Request.Files;
if (files != null)
{
    string[] keys = files.AllKeys;
    foreach (string key in keys)
    {
        HttpPostedFileBase file = files[key];
        ValueProviderResult result = new ValueProviderResult(file, file.FileName, currentCulture);
        AddToDictionaryIfNotPresent(key, result);
    }
}
0 голосов
/ 05 апреля 2009

В течение прошлой недели я строил систему загрузки / управления файлами для своего проекта MVC, и моей первоначальной попыткой было опубликовать дополнительные данные поста со значениями из нескольких файлов. это оказалось слишком трудным для моих временных ограничений. Мой подход сейчас заключается в создании «соответствующей записи», к которой файлы / изображения могут быть «прикреплены» (как это имеет место в моем случае), - затем загрузите («прикрепите») файлы / изображения после того, как запись присутствует.

например: 1) создать запись о событии, 2) прикрепить изображения с контролем загрузки

В моем действии, которое получает составной пост, используются понятия из поста Хансельмана .

Не могу сказать, что пробовал встроенную привязку сложного типа для файлов (HttpPostedFileBase), но я бы предположил, что она будет более сложной, чем мое настоящее решение, учитывая, что после прочтения поста, написанного Хансельманом выше - я мы узнали, что коллекция файлов, возвращенная в Request, является только свободно типизированной коллекцией.

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

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