簡體   English   中英

asp.net mvc控制器中的文件上傳錯誤('HttpRequestMessage'不包含'Files'的定義

[英]File upload error in asp.net mvc controller ('HttpRequestMessage' does not contain a definition for 'Files'

我有一個控制器鏈接到輸入元素進行上傳。 在我的控制器中,我得到一個奇怪的錯誤,我不太明白。 嚴重性代碼描述項目路徑文件行抑制狀態

錯誤CS1061'HttpRequestMessage'不包含'Files'的定義,並且沒有可訪問的擴展方法'Files'可以找到接受類型'HttpRequestMessage'的第一個參數(你是否缺少using指令或程序集引用?)SimSentinel C: \\ Users \\ tsach \\ Source \\ Workspaces \\ SIMSentinelv2 \\ Website \\ SimSentinel \\ SimSentinel \\ Controllers C:\\ Users \\ tsach \\ Source \\ Workspaces \\ SIMSentinelv2 \\ Website \\ SimSentinel \\ SimSentinel \\ Controllers \\ BulkSMSUploadController.cs

    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);
      }
   }

}

您應該小心以下步驟。

  • 確保你的表單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; } public HttpPostedFileBase File { get; set; } public HttpPostedFileBase File { get; set; }在您的視圖模型。 然后你可以在剃須刀上輕松使用它。

    @ 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,你應該發送byte []並將這個byte []處理到你的apiController中。

從我看到你的控制器實現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.ControllerSystem.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 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM