[英]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);
}
}
}
您應該小心以下步驟。
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.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
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.