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>

再简单不过了!!!

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

相关推荐
大熊程序猿2 天前
ASP.NET Core 认证授权:JWT与OAuth2实战
后端·asp.net
那个失眠的夜2 天前
SpringBoot
java·开发语言·spring boot·spring·mvc·mybatis
cheems95272 天前
[Spring MVC] 统一功能与拦截器实践总结
java·spring·mvc
超級二蓋茨3 天前
asp.net core中JwtBearerEvents中几个事件的生命周期
java·服务器·asp.net
William_cl3 天前
第 1 节:MVC + DataTable 百万数据秒加载 —— 企业级服务端分页实战
mvc·状态模式
ze^04 天前
Day01 Web应用&架构搭建&域名源码&站库分离&MVC模型&解析受限&对应路径
安全·web安全·架构·mvc·安全架构
身如柳絮随风扬4 天前
MVC 三层结构深度解析:概念、作用与实战经验
mvc
编码者卢布5 天前
【Azure Developer】ASP.NET Framework 4.8 集成 Azure Application Insights SDK 完整指南
microsoft·asp.net·azure
祀爱5 天前
定时任务之BackgroundService的详细教程
后端·c#·asp.net
Cyan_RA95 天前
SpringMVC 数据格式化处理 详解
java·开发语言·spring·mvc·ssm·springmvc·数据格式化