ASP.NET MVC AJAX 文件上传

如何使用 MVC 5 和 AJAX(.NET Framework)上传文件。

使用AJAX和ASP.NET MVC 上传文件 再简单不过了。对于最纯粹的人来说,这不需要使用jQuery。此代码实际上允许上传多个文件。

注意:以下代码示例支持 ASP.NET MVC 5。如果使用 .NET Core,请转到ASP.NET Core 示例

首先,在 Visual Studio 中创建一个名为"Website"的 Web 应用程序 (MVC)。

现在,客户端。一半的工作由函数完成buildFormData()。有关的完整实现buildFormData(),请参阅AJAX 库源代码

如果使用 CSHTML 文件,则使用此代码:

@{

Layout = null;

}

<html>

<head>

<title></title>

<script type="text/javascript">

function xmlHttp(){

if(XMLHttpRequest){

return new XMLHttpRequest();

} else if(window.ActiveXObject){

var aVersions = ["MSXML2.XMLHttp.5.0","MSXML2.XMLHttp.4.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp","Microsoft.XMLHttp"];

for(var i = 0; i < aVersions.length; i++){

try{

var oXmlHttp = new ActiveXObject(aVersions[i]);

return oXmlHttp;

}catch(oError){

//void

}

}

}

throw new Error("XMLHttp object could not be created.");

}

//used for posting "multipart/form-data"

function buildFormData(form_object) {

var fd = new FormData();

for (var i = 0; i < form_object.elements.length; i++) {

if (form_object.elements[i].name != null && form_object.elements[i].name != "") {

if (form_object.elements[i].type == "checkbox") {

if (form_object.elements[i].checked) {

fd.append(form_object.elements[i].name, form_object.elements[i].value)

}

}

else if (form_object.elements[i].type == "file") {

for (var j = 0; j < form_object.elements[i].files.length; j++) {

fd.append(form_object.elements[i].name,

form_object.elements[i].files[j],

form_object.elements[i].files[j].name)

}

}

else {

fd.append(form_object.elements[i].name, form_object.elements[i].value)

}

}

}

return fd;

}

function submitForm(oform)

{

if (window.FormData !== undefined) {

document.getElementById("SubmitButton").disabled = true;

var formData = buildFormData(oform);

var xmlobj = xmlHttp();

xmlobj.onreadystatechange = function () {

if (xmlobj.readyState == 4) {

if (xmlobj.status == 200) {

document.getElementById("divResponse").innerHTML = xmlobj.responseText;

document.getElementById("SubmitButton").disabled = false;

}

else {

throw new Error("Error: " + xmlobj.status + ": " + xmlobj.statusText);

}

}

};

xmlobj.open("post", oform.action, true);

xmlobj.send(formData);

}

else {

alert("This browser does not support posting files with HTML5 and AJAX.");

}

return false;

}

</script>

</head>

<body>

<form enctype="multipart/form-data" οnsubmit="return submitForm(this);" method="post" action="/Ajax/UploadFile">

@Html.AntiForgeryToken()

<input type="text" required name="fullname" placeholder="enter your name here" /><br />

<input type="file" accept="image/jpeg" multiple required name="file1" /><br />

<input type="submit" id="SubmitButton" value="Upload File(s)" />

</form>

<div id="divResponse"></div>

</body>

</html>

如果仍在使用 ASPX 文件,则使用此代码:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>

<html>

<head>

<title></title>

<script type="text/javascript">

function xmlHttp(){

if(XMLHttpRequest){

return new XMLHttpRequest();

} else if(window.ActiveXObject){

var aVersions = ["MSXML2.XMLHttp.5.0","MSXML2.XMLHttp.4.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp","Microsoft.XMLHttp"];

for(var i = 0; i < aVersions.length; i++){

try{

var oXmlHttp = new ActiveXObject(aVersions[i]);

return oXmlHttp;

}catch(oError){

//void

}

}

}

throw new Error("XMLHttp object could not be created.");

}

//used for posting "multipart/form-data"

function buildFormData(form_object) {

var fd = new FormData();

for (var i = 0; i < form_object.elements.length; i++) {

if (form_object.elements[i].name != null && form_object.elements[i].name != "") {

if (form_object.elements[i].type == "checkbox") {

if (form_object.elements[i].checked) {

fd.append(form_object.elements[i].name, form_object.elements[i].value)

}

}

else if (form_object.elements[i].type == "file") {

for (var j = 0; j < form_object.elements[i].files.length; j++) {

fd.append(form_object.elements[i].name,

form_object.elements[i].files[j],

form_object.elements[i].files[j].name)

}

}

else {

fd.append(form_object.elements[i].name, form_object.elements[i].value)

}

}

}

return fd;

}

function submitForm(oform)

{

if (window.FormData !== undefined) {

document.getElementById("SubmitButton").disabled = true;

var formData = buildFormData(oform);

var xmlobj = xmlHttp();

xmlobj.onreadystatechange = function () {

if (xmlobj.readyState == 4) {

if (xmlobj.status == 200) {

document.getElementById("divResponse").innerHTML = xmlobj.responseText;

document.getElementById("SubmitButton").disabled = false;

}

else {

throw new Error("Error: " + xmlobj.status + ": " + xmlobj.statusText);

}

}

};

xmlobj.open("post", oform.action, true);

xmlobj.send(formData);

}

else {

alert("This browser does not support posting files with HTML5 and AJAX.");

}

return false;

}

</script>

</head>

<body>

<form enctype="multipart/form-data" οnsubmit="return submitForm(this);" method="post" action="/Ajax/UploadFile">

<%: Html.AntiForgeryToken() %>

<input type="text" required name="fullname" placeholder="enter your name here" /><br />

<input type="file" accept="image/jpeg" multiple required name="file1" /><br />

<input type="submit" id="SubmitButton" value="Upload File(s)" />

</form>

<div id="divResponse"></div>

</body>

</html>

接下来是服务器端。创建一个名为"Ajax"的控制器并添加UploadFile()方法。

// AjaxController.cs

using System;

using System.Web.Mvc;

namespace Website.Controllers

{

public class AjaxController : Controller

{

HttpPost

ValidateInput(false)

ValidateAntiForgeryToken

public string UploadFile()

{

int i;

for (i = 0; i < Request.Files.Count; i++)

{

if (Request.Files[i].ContentLength > 0)

{

if (Request.Files[i].ContentType.ToLower() == "image/jpeg") // can be modified or omitted

{

try

{

// make sure that this directory has write permissions

Request.Files[i].SaveAs(Request.MapPath("/") + Request.Files[i].FileName);

}

catch (Exception ex)

{

return ex.Message.ToString();

}

}

}

}

return i.ToString() + " files copied. Hello, " + Request.Form["fullname"];

}

}

}

收尾工作

最后,确保服务器将接受大型上传并给予上传足够的时间来完成(超时)。编辑Web.config文件以包含这些部分。注意:ASP.NET Core 要求您创建一个web.config文件。

<system.web>

<httpRuntime executionTimeout="600" maxRequestLength="20480" requestValidationMode="2.0"/>

</system.web>

<system.webServer>

<security>

<requestFiltering>

<requestLimits maxAllowedContentLength="102400000"/>

</requestFiltering>

</security>

</system.webServer>

再简单不过了!!!

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
学IT的周星星15 小时前
《Spring MVC奇幻漂流记:当Java遇上Web的奇妙冒险》
java·spring·mvc
你的电影很有趣1 天前
lesson70:jQuery Ajax完全指南:从基础到4.0新特性及现代替代方案引言:jQuery Ajax的时代价值与演进
javascript·ajax·jquery
老葱头蒸鸡2 天前
(23)ASP.NET Core2.2 EF关系数据库建模
后端·asp.net
linuxxx1102 天前
ajax与jQuery是什么关系?
ajax·okhttp·jquery
Elieal2 天前
SpringMVC 入门:核心概念与第一个 HelloWorld 案例
mvc·maven
这周也會开心2 天前
Spring-MVC响应
java·spring·mvc
老葱头蒸鸡2 天前
(14)ASP.NET Core2.2 中的日志记录
后端·asp.net
William_cl2 天前
【连载7】 C# MVC 跨框架异常处理对比:.NET Framework 与 .NET Core 实现差异
c#·mvc·.net
准时准点睡觉2 天前
HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容——错误代码:0x00000000
运维·服务器·iis·asp.net
城管不管4 天前
Spring + Spring MVC + MyBatis
java·spring·mvc