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>

再简单不过了!!!

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

相关推荐
William_cl1 天前
【C# OOP 入门到精通】从基础概念到 MVC 实战(含 SOLID 原则与完整代码)
开发语言·c#·mvc
Xzh04231 天前
前后端学习的交界
java·ajax·maven·axios·测试
我登哥MVP2 天前
Ajax 详解
java·前端·ajax·javaweb
仲夏幻境2 天前
js利用ajax同步调用如何
开发语言·javascript·ajax
寒月霜华2 天前
JavaWeb前端-Ajax
ajax
蹦极的考拉2 天前
PHPCMS V9 自定义证书查询模块(Ajax+防刷+倒计时)
ajax·证书查询·phpcmsv9表单
William_cl3 天前
一、前置基础(MVC学习前提)_核心特性_【C# 泛型入门】为什么说 List<T>是程序员的 “万能收纳盒“?避坑指南在此
学习·c#·mvc
合作小小程序员小小店3 天前
Web渗透之身份认证与访问控制缺陷(越权(水平垂直),访问控制(没有验证),脆弱验证(Cookie,JWT,Session等))
安全·web安全·网络安全·asp.net·网络攻击模型
.生产的驴3 天前
React useEffect组件渲染执行操作 组件生命周期 监视器 副作用
前端·css·react.js·ajax·前端框架·jquery·html5
程序员小凯4 天前
Spring MVC 分布式事务与数据一致性教程
分布式·spring·mvc