как получить httppostedfile из вызова веб-API ASP.NET (POST или PUT)?

На самом деле мой вопрос короткий.

Как я могу получить HttpPostedFile из POST или PUT веб-API ASP.NET?

Я видел, что могу получить различную информацию из запроса, например Request.Header, Request.Content, Request.Properties. Где я могу найти файл, который я передал, и как я могу создать из него HttpPostedFile?

Заранее спасибо!


person SwissCoder    schedule 25.05.2012    source источник


Ответы (2)


Боюсь, на ваш короткий вопрос нет короткого ответа.

Веб-API ASP.NET открывает вам чудеса HTTP, в то время как ASP.NET MVC абстрагируется от некоторых из них — в данном случае для HttpPostedFile.

Итак, немного предыстории:

Сообщения HTTP, в которых задействован файл, обычно содержат составные данные формы. содержание. Это означает, что вы смешиваете разные типы контента: ваши обычные данные формы будут отправлены с использованием formurlencoded, а файлы будут отправлены application/octent-stream.

Итак, в веб-API все, что вам нужно сделать, это сказать

var contents = message.Content.ReadAsMultipartAsync(); // message is HttpRequestMessage

Одно из содержимого будет содержать ваш файл.

person Aliostad    schedule 25.05.2012

Ознакомьтесь с отличная статья от Хенрика Нильсена о размещении контента, состоящего из нескольких частей (например, публикации формы с файлом)

ОБНОВЛЕНИЕ: добавлен простой код для получения контроллером файла без составного содержимого.

Если вам нужен только ваш контроллер для получения файла (т. е. без составного содержимого), вы можете сделать что-то вроде приведенного выше. Запрос содержит только двоичный файл, а имя файла передается в URL-адресе.

public Task<HttpResponseMessage> Post([FromUri]string filename)
{
    Guid uploadedFile = Guid.NewGuid();
    Task<HttpResponseMessage> task = Request.Content.ReadAsStreamAsync().ContinueWith<HttpResponseMessage>(t =>
         {
            if (t.IsFaulted || t.IsCanceled)
                throw new HttpResponseException(HttpStatusCode.InternalServerError);

            try
            {
                using (Stream stream = t.Result)
                {
                    //TODO: Write the stream to file system / db as you need
                }
            }
            catch (Exception e)
            {
                Object o = e;
                return Request.CreateResponse(HttpStatusCode.InternalServerError, e.GetBaseException().Message);
             }

            return Request.CreateResponse(HttpStatusCode.Created, uploadedFile.ToString());
         });


    return task;
}
person Julien Jacobs    schedule 26.05.2012
comment
@StijnSpijker - Готово. Ответ обновлен с образцом кода. - person Julien Jacobs; 12.10.2014