使用NeatUpload控件实现ASP.NET大文件上传

在ASP.NET网站开发过程中,文件上传功能十分常见,其中大文件上传往往需要使用特殊的工具来处理。本文将介绍一种常用的ASP.NET文件上传控件NeatUpload,以及如何使用它实现大文件上传。

一、NeatUpload介绍

NeatUpload是一个开源的ASP.NET文件上传控件库,支持多种文件上传方式,包括简单的上传和高级的断点续传功能。NeatUpload支持各种浏览器,包括较早的浏览器和移动设备浏览器。该控件库还提供了很多可定制的特性,如上传进度显示、上传限制、文件验证和事件回调,以及运行的安全性。

二、NeatUpload安装

NeatUpload可以通过NuGet包管理器进行安装,也可以手动下载地址:https://sourceforge.net/projects/neatupload/files/latest/download。

在NuGet包管理器中搜索“NeatUpload”,选择“安装”按钮进行安装。

三、使用NeatUpload实现大文件上传

首先,在页面中添加以下代码:

```

<%@ Register TagPrefix="cc1" Namespace="Brettle.Web.NeatUpload" Assembly="Brettle.Web.NeatUpload" %>

```

其中,`<%@ Register %>`用于注册NeatUpload控件,`MaxSize`属性用于设置上传文件的最大大小,`StoreFileDataInSession`属性用于设置上传文件的数据是否存储在会话中,`PostBackUrl`属性用于设置上传完成后的跳转页面。

接着,添加以下代码用于处理上传事件:

```

protected void Page_Load(object sender, EventArgs e)

{

if (IsPostBack)

{

if (FileSizeUp0.State == UploadState.Completed)

{

string fileName = FileSizeUp0.FileUniqueId + Path.GetExtension(FileSizeUp0.FileName);

string filePath = Path.Combine(Server.MapPath("~/Upload/"), fileName);

FileSizeUp0.MoveTo(filePath);

Response.Redirect("~/Upload/UploadComplete.aspx");

}

}

}

```

其中,判断是否为PostBack请求,并使用`FileSizeUp0.State`属性获取当前上传状态,若上传状态为“完成”,则获取上传文件名,将上传文件移动到指定文件夹,并跳转到上传完成后的页面。

最后,添加以下代码用于在上传控件中显示上传进度:

```

<% if (FileSizeUp0.PercentComplete > 0) { %>

<%=fileName%>

<%} %>

```

在上述代码中,我们使用了jQuery来对文件上传进行监控和处理,并在页面中使用CSS和HTML来显示上传进度条和已上传文件列表。其中,文件上传进度是通过异步JavaScript请求一个名为`UploadStatus.ashx`的ASHX处理程序来获取的,该处理程序保存了上传进度信息和上传状态信息,并将其作为JSON格式返回。

接着,我们需要编写`UploadStartButton_Click`事件处理程序来处理上传文件的S3。在该事件处理程序中,我们使用`HttpContext.Current.Request.Files`属性来获取上传的文件,并在服务器上保存文件,同时将文件信息添加到`file-list`中。代码片段如下:

```

protected void UploadStartButton_Click(object sender, EventArgs e)

{

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

{

var file = HttpContext.Current.Request.Files[i];

if (file != null && file.ContentLength > 0)

{

string fileName = Path.GetFileNameWithoutExtension(file.FileName) + "_" + Guid.NewGuid().ToString() + Path.GetExtension(file.FileName);

string filePath = Path.Combine(Server.MapPath("~/Upload/"), fileName);

using (Stream inputStream = file.InputStream)

{

using (FileStream outputStream = new FileStream(filePath, FileMode.Create))

{

byte[] buffer = new byte[8192];

int bytesRead;

while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0)

{

outputStream.Write(buffer, 0, bytesRead);

}

}

}

}

}

Response.Redirect(Request.Url.AbsoluteUri);

}

```

最后,我们需要创建一个`UploadStatus.ashx`处理程序用于处理`UploadStartButton_Click`事件处理程序中获取上传状态的请求。代码如下:

```

<%@ WebHandler Language="C#" Class="UploadStatus" %>

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using Brettle.Web.NeatUpload;

public class UploadStatus : IHttpHandler

{

public void ProcessRequest(HttpContext context)

{

context.Response.ContentType = "application/json";

var uploadModule = new UploadHttpModule();

var uploadContext = new UploadContext(context);

if (!uploadContext.TryGetValue("CcGuid", out var sessionGuid) || sessionGuid == null)

{

context.Response.Write("{ 'progress': 0, 'state': 'Unknown' }");

return;

}

var uploader = uploadModule.GetUploader(sessionGuid.ToString());

if (uploader == null)

{

context.Response.Write("{ 'progress': 0, 'state': 'Unknown' }");

return;

}

string progress = String.Format("{0:0.0}", uploader.PercentComplete);

string state = String.Empty;

switch (uploader.State)

{

case UploadState.NotStarted:

state = "Not started";

break;

case UploadState.Started:

state = "In progress";

break;

case UploadState.Completed:

state = "Completed";

break;

case UploadState.Canceled:

state = "Cancelled";

break;

case UploadState.Error:

state = "Error";

break;

}

context.Response.Write("{ 'progress': " + progress + ", 'state': '" + state + "' }");

}

public bool IsReusable

{

get

{

return false;

}

}

}

```

至此,我们就完成了使用NeatUpload控件实现大文件上传和文件浏览下载的任务。

总结

本文介绍了一个常用的ASP.NET文件上传控件库NeatUpload,以及如何通过使用NeatUpload控件库实现大文件上传。具体而言,我们在ASP.NET项目中引入了NeatUpload控件库,并利用其中提供的API实现了文件上传的功能和断点续传功能。此外,我们还通过JavaScript和CSS实现了上传进度条的功能,同时为用户提供了一个简单的文件浏览下载界面,使得用户可以方便地浏览和下载上传的文件。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(108) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部