Ошибка загрузки файла в контроллере asp.net mvc («HttpRequestMessage» не содержит определения «Файлы» - PullRequest
0 голосов
/ 29 октября 2018

У меня есть ссылка контроллера на элемент ввода для загрузки. В моем контроллере я получаю странную ошибку, которую я не совсем понимаю. Код серьезности Описание Путь к файлу проекта Состояние подавления строки

Ошибка CS1061 «HttpRequestMessage» не содержит определения для «Файлы» и недоступный метод расширения «Файлы», принимающие первый аргумент типа «HttpRequestMessage» может быть найден (вы пропустили директива об использовании или сборка ссылка?) SimSentinel C: \ Users \ tsach \ Source \ Workspaces \ SIMSentinelv2 \ Website \ SimSentinel \ SimSentinel \ Контроллеры C: \ Users \ tsach \ Source \ Workspaces \ SIMSentinelv2 \ Веб-сайт \ SimSentinel \ SimSentinel \ Контроллеры \ BulkSMSlercsp \ *

    using System.Data;
    using System.Linq;
    using System.Web.Http;
    using System.Web.Security;
    using Repositories.Interfaces;
    using Repositories.Interfaces.Dtos;
    using SimSentinel.Models;
    using System;
    using System.Text.RegularExpressions;
    using Newtonsoft.Json.Linq;
    using Newtonsoft.Json.Schema;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    //using System.Web.Http.HttpPut;


    namespace SimSentinel.Controllers
    {
        [System.Web.Http.Authorize]
        public class BulkSMSUploadController : ApiController
        {
          public ActionResult Index()
          {
             //ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";

             //return View();
             return null; 
          }

          [System.Web.Mvc.HttpPost]
          public ActionResult UploadFiles()
          {
             if (Request.Files.Count <= 0)
             {
                return Json("No files selected.");
             }
             else
             {
                try
                {
                   HttpFileCollectionBase files = Request.Files;
                   for (int i = 0; i < files.Count; i++)
                   {
                      string path = AppDomain.CurrentDomain.BaseDirectory + "Uploads/";
                      string filename = Path.GetFileName(Request.Files[i].FileName);

                      HttpPostedFileBase file = files[i];
                      string fname;
                      if (Request.Browser.Browser.ToUpper() == "IE" || Request.Browser.Browser.ToUpper() == "INTERNETEXPLORER")
                      {
                         string[] testfiles = file.FileName.Split(new char[] { '\\' });
                         fname = testfiles[testfiles.Length - 1];
                      }
                      else
                      {
                         fname = file.FileName;
                      }

                      fname = Path.Combine(Server.MapPath("~/Uploads/"), fname);
                      file.SaveAs(fname);
                   }

                   return Json("File Uploaded Successfully!");
                }
                catch (Exception ex)
                {
                   return Json("Error occurred. Error details: " + ex.Message);
                }
             }
          }

          //public ActionResult About()
          //{
          //   ViewBag.Message = "Your app description page.";

          //   return View();
          //}
       }
    }

Итак, после всего этого я настроил свой контроллер. Посмотрите код ниже, который работает, однако он перенаправляет на фактический контроллер, и это является проблемой в приложении SPA. Кроме того, файл также сохраняется в странном формате, почти как случайно сгенерированная строка, такая как BodyPart_2ea18b56-0c11-41f6-81ff-204bb377cbbf

using System.Diagnostics;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;

public class Upload2Controller : ApiController
{
   public async Task<HttpResponseMessage> PostFormData()
   {
      // Check if the request contains multipart/form-data.
      if (!Request.Content.IsMimeMultipartContent())
      {
         throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
      }

      string root = HttpContext.Current.Server.MapPath("~/Files");
      var provider = new MultipartFormDataStreamProvider(root);

      try
      {
         // Read the form data.
         await Request.Content.ReadAsMultipartAsync(provider);

         // This illustrates how to get the file names.
         foreach (MultipartFileData file in provider.FileData)
         {
            Trace.WriteLine(file.Headers.ContentDisposition.FileName);
            Trace.WriteLine("Server file path: " + file.LocalFileName);
         }
         return Request.CreateResponse(HttpStatusCode.OK);
      }
      catch (System.Exception e)
      {
         return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
      }
   }

}

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Из того, что я вижу, ваш контроллер реализует контроллер Web API (то есть, используя ApiController.Request), который имеет определение, как показано ниже:

public System.Net.Http.HttpRequestMessage Request { get; set; }

Тип возврата - HttpRequestMessage, который не имеет свойства Files, в отличие от предполагаемого HttpRequestBase, который реализован как тип возврата Controller.Request свойство ниже:

public System.Web.HttpRequestBase Request { get; }

Чтобы решить эту проблему, вам нужно наследовать от System.Web.Mvc.Controller базового класса и переместить запросы Web API в другой класс, который наследует ApiController, потому что вы не можете наследовать и System.Web.Mvc.Controller, и System.Web.Http.ApiController в одном классе:

namespace SimSentinel.Controllers
{
   public class BulkSMSUploadController : Controller
   {
      [System.Web.Mvc.HttpPost]
      public ActionResult UploadFiles()
      {
         if (Request.Files.Count <= 0)
         {
            return Json("No files selected.");
         }
         else
         {
            try
            {
               HttpFileCollectionBase files = Request.Files;
               for (int i = 0; i < files.Count; i++)
               {
                  string path = AppDomain.CurrentDomain.BaseDirectory + "Uploads/";
                  string filename = Path.GetFileName(Request.Files[i].FileName);

                  HttpPostedFileBase file = files[i];
                  string fname;
                  if (Request.Browser.Browser.ToUpper() == "IE" || Request.Browser.Browser.ToUpper() == "INTERNETEXPLORER")
                  {
                     string[] testfiles = file.FileName.Split(new char[] { '\\' });
                     fname = testfiles[testfiles.Length - 1];
                  }
                  else
                  {
                     fname = file.FileName;
                  }

                  fname = Path.Combine(Server.MapPath("~/Uploads/"), fname);
                  file.SaveAs(fname);
               }

               return Json("File Uploaded Successfully!");
            }
            catch (Exception ex)
            {
               return Json("Error occurred. Error details: " + ex.Message);
            }
         }
      }
   }

   [System.Web.Http.Authorize]
   public class BulkSMSUploadWebApiController : ApiController
   {
       public IHttpActionResult Index()
       {
           return null; 
       }
   }
}

Если вы хотите загрузить файл с помощью контроллера Web API, вы должны использовать HttpResponseMessage для получения сведений о файле с помощью MultipartFileData, как указано в в этом примере (убедитесь, что вы проверяете по IsMimeMultipartContent первый).

0 голосов
/ 29 октября 2018

Вы должны быть осторожны при выполнении следующих шагов.

  • Убедитесь, что ваш HTML-элемент формы имеет enctype = "multipart/form-data" Так должно быть что-то вроде <form action="someaction" enctype = "multipart/form-data"> </form>

Я обычно использую html helper ..

@using (Html.BeginForm("Index", "JobApplication", FormMethod.Post, new { @enctype = "multipart/form-data", @id = "myForm", @class = "form-horizontal" }))
    {
// your input datas
}
  • Если вы хотите опубликовать изображение или какой-либо документ, несмотря на использование запроса, вы должны использовать public HttpPostedFileBase File { get; set; } в вашей ViewModel. Тогда вы можете легко использовать его на своей бритве.

    @Html.TextBoxFor (m => m.File, new {@type = "file", @onchange = "SomeValidationOnClientSide (this);"})

На серверной стороне вы можете подтвердить свое дело. В моем случае я принимаю только файлы PDF ..

if ((from file in model.Files where file != null select file.FileName.Split('.')).Any(arr => arr[arr.Length - 1].ToLower() != "pdf"))
        {
            ModelState.AddModelError(string.Empty, "We only accept PDF files!");
            return View(model);
        }
        if (model.Files.Count() > 2)
        {
            ModelState.AddModelError(string.Empty,
                "You have exceeded maximum file upload size. You can upload maximum 2 PDF file!");
            return View(model);
        }

Редактировать: Я вижу, что вы реализовали ApiController вместо Contoller. Итак, я понимаю, что вы разрабатываете WEB.API, вы должны добавить это и в теги вопросов.

Если вы хотите разработать ApiController, вы должны отправить байт [] и обработать этот байт [] в свой apiController.

...