大文件上传,支持续传(ASP.NET MVC2+Flex)

news/2024/5/19 19:54:31 标签: asp.net, flex, mvc, string, file, path

实现原理

客户端读取文件流,把文件分成多份数据,然后一份一份向服务端发送。服务端接收数据,写入到服务端文件。

定义上传文件的服务端接口(ASP.NET MVC2)

主要接口

  • 获取上传文件:服务端生成一个文件名返回给客户端,确保所有用户上传时文件名不冲突。
  • 分段上传文件:服务端接收后写入到文件流,返回服务端已上传的文件长度给客户端。
  • 取消上传:删除服务端文件, 避免积累大量无效的上传文件。

FileUploadController源码:

using System;

using System.Web.Mvc;

using System.IO;

 

namespace DotNetMvc.Controllers

{

    public class FileUploadController : Controller

    {

        // 自定义返回格式

        private ActionResult JsonResult(object returnValue, int errorCode = 0, string errorMessage = "")

        {

            return Json(new

            {

                ErrorCode = errorCode,

                ErrorMessage = errorMessage,

                ReturnValue = returnValue

            },

            JsonRequestBehavior.AllowGet//允许Get调用,默认是不允许。

            );

        }

        // 获取上传文件,由服务端决定上传文件命名策略

        public ActionResult GetFile(string file)

        {

            string result = DateTime.Now.ToString("yyyy-MM-dd-") +

                Path.GetFileNameWithoutExtension(file) + Guid.NewGuid().ToString().Replace("-", "") +

                Path.GetExtension(file);

 

            return JsonResult(result);// 返回文件名称

        }

        private string GetUploadFilePath(string file)

        {

            string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Uploads//" + file);

            return path;

        }

        // 分段上传文件

        public ActionResult Upload(string file, long start, string base64)

        {

            string path = GetUploadFilePath(file);

            byte[] bytes = Convert.FromBase64String(base64);

            using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write))

            {

                fs.Seek(start, SeekOrigin.Begin);

                fs.Write(bytes, 0, bytes.Length);

                fs.Close();

            }

            long result = start + bytes.Length;

            return JsonResult(result);// 返回新文件长度

        }

        // 取消上传,删除上传文件

        public ActionResult Cancel(string file)

        {

            string path = GetUploadFilePath(file);

            System.IO.File.Delete(path);

 

            return JsonResult(true);

        }

        // 自定义错误

        public ActionResult Error(string message)

        {

            return JsonResult(null, 404, message);

        }

        // 捕捉未知错误

        protected override void OnException(ExceptionContext filterContext)

        {

            base.OnException(filterContext);

            Server.ClearError();

            Response.Redirect("~/FileUpload/Error?message=" + Uri.EscapeDataString(filterContext.Exception.Message));

        }

    }

}

客户端调用上传接口 (Flex)

主要步骤

  • 使用FileReference.browse()方法选择文件。
  • 使用FileReference.load()方法加载本地文件。
  • 通过FileReference.data属性访问加载的文件流,调用FileReference.load()后FileReference.data属性不会立即赋值,当Event.COMPLETE事件派发后data才赋值。
  • 分段读取FileReference.data的bytes上传到服务端,数据传输时,bytes需要采用base64编码成字符串发送,服务端要进行base64解码。

效果图

总结

该上传方案的优点是支持大文件上传,支持续传,缺点是上传效率略低。

进阶

多文件上传:Flex客户端使用FileReferenceList对象,可实现多个文件上传。

优化上传效率:把文件分成几个大数据块,然后每个数据块分别上传,服务端管理各个大数据块的写入,确保最后能够从新拼接成原始文件。(类似多线程下载)


http://www.niftyadmin.cn/n/1574712.html

相关文章

高手如何实践HBase?不容错过的滴滴内部技巧

摘要: HBase和Phoenix的优势大家众所周知,想要落地实践却问题一堆?replication的随机发送、Connection的管理是否让你头痛不已?本次分享中,滴滴以典型的应用场景带大家深入探究HBase和Phoenix,并分享内核改…

表达式解析引擎的设计

前言 表达式的计算是一个一般性的问题。在报表领域,经常会出现支持计算公式的需求。MS Office Excel中的函数计算就是一个很好的参考例子。 本文提供一个表达式引擎的设计方案,能够满足报表领域的复杂计算要求。 一个良好的表达式引擎应该支持基本的…

使用kibana可视化报表实时监控你的应用程序,从日志中找出问题,解决问题

先结果导向&#xff0c;来看我在kibana dashborad中制作的几张监控图。 一&#xff1a;先睹为快 dashboard1&#xff1a;监控几个维度的日志&#xff0c;这么点日志量是因为把无用的清理掉了&#xff0c;而且只接入了部分应用。 <1> 每日日志总数。 <2> 每日日志…

Flex——Array,ArrayCollection,Vector性能比较

测试方法 private function Test():void { for(var j:int0;j<5;j) { trace("插入10000项"); var t1:int, t2:int; var i:int 0; var a:Array new Array(); var al:ArrayCollection new ArrayCollection(); var item:String; var v:Vector.<Str…

图表篇——Xml To Chart (饼图3D)

前言 一个实现Xml To Chart的图表引擎&#xff0c;通过Xml配置就能够呈现相应的图表。而且能够方便集成到所需的软件系统&#xff0c;例如&#xff0c;MyReport报表引擎 效果图 XML定义说明 <!-- 图表根节点。type属性&#xff1a;图表类型 --> <ChartSettings…

时间空间复杂度的初步理解---后续补充

时间复杂度&#xff1a;算法需要执行的次数。空间复杂度&#xff1a;算法需要消耗的内存空间大小。计算 1加到100算法1&#xff1a;&#xff08;1100&#xff09;*&#xff08;100/2&#xff09; 5050 时间复杂度 0(1) 因为只执行了一次。算法2&#xff…

图表篇——Xml To Chart (柱状图3D)

前言 一个实现Xml To Chart的图表引擎&#xff0c;通过Xml配置就能够呈现相应的图表。而且能够方便集成到所需的软件系统&#xff0c;例如&#xff0c;MyReport报表引擎 效果图 XML定义说明 <!-- 图表根节点。type属性&#xff1a;图表类型 --> <ChartSettings …

图表篇——Xml To Chart (折线图3D)

前言 一个实现Xml To Chart的图表引擎&#xff0c;通过Xml配置就能够呈现相应的图表。而且能够方便集成到所需的软件系统&#xff0c;例如&#xff0c;MyReport报表引擎 效果图 XML定义说明 <!-- 图表根节点。type属性&#xff1a;图表类型 --> <ChartSettings…