常用的操作类,大都是静态类。by 懒得勤快
加密解密,反射操作,权重随机筛选算法,分布式短id,表达式树,linq扩展,文件压缩,多线程下载和FTP客户端,硬件信息,字符串扩展方法,日期时间扩展操作,中国农历,大文件拷贝,图像裁剪,验证码,断点续传,集合扩展、Excel导出等常用封装。

懒得勤快 29bc12da79 Update README.md 6 년 전
Masuit.Tools 55ca75c4c7 .Net Framework版本的ResumeFileResult 6 년 전
Masuit.Tools.AspNetCore.ResumeFileResults.WebTest 4b0a533ec7 asp.net core新增支持断点续传和支持多线程下载的ResumeFileResult 6 년 전
Masuit.Tools.Core 4b0a533ec7 asp.net core新增支持断点续传和支持多线程下载的ResumeFileResult 6 년 전
Masuit.Tools.Core.UnitTest 4b0a533ec7 asp.net core新增支持断点续传和支持多线程下载的ResumeFileResult 6 년 전
Masuit.Tools.NoSQL.MongoDBClient 4b0a533ec7 asp.net core新增支持断点续传和支持多线程下载的ResumeFileResult 6 년 전
Masuit.Tools.NoSQL.MongoDBClient.Core 7332095708 1.新增任意进制转换操作 6 년 전
Masuit.Tools.NoSQL.MongoDBClient.Core.UnitTest 458b68e47d 升级包 7 년 전
Masuit.Tools.NoSQL.MongoDBClient.UnitTest 458b68e47d 升级包 7 년 전
Masuit.Tools.UnitTest 55ca75c4c7 .Net Framework版本的ResumeFileResult 6 년 전
Masuit.Tools帮助文档 270817e4b3 API调整 8 년 전
MasuitToolsNugetPackage 9854c15f0a 获取IP地址信息的方法增加容错机制 8 년 전
NetCoreTest 4b0a533ec7 asp.net core新增支持断点续传和支持多线程下载的ResumeFileResult 6 년 전
Test 4b0a533ec7 asp.net core新增支持断点续传和支持多线程下载的ResumeFileResult 6 년 전
.gitattributes 47532a459d 添加 .gitignore 和 .gitattributes。 8 년 전
.gitignore 47532a459d 添加 .gitignore 和 .gitattributes。 8 년 전
LICENSE 995c8e2155 Initial commit 8 년 전
Masuit.Tools.sln 4b0a533ec7 asp.net core新增支持断点续传和支持多线程下载的ResumeFileResult 6 년 전
Masuit.Tools.sln.DotSettings 4b0a533ec7 asp.net core新增支持断点续传和支持多线程下载的ResumeFileResult 6 년 전
README.md 29bc12da79 Update README.md 6 년 전

README.md

Masuit.Tools

包含一些常用的操作类,大都是静态类,加密解密,反射操作,硬件信息,字符串扩展方法,日期时间扩展操作,大文件拷贝,图像裁剪,验证码等常用封装。 官网教程

Asp.Net MVC和Asp.Net Core的支持断点续传和多线程下载的ResumeFileResult

允许你在ASP.NET Core中通过MVC/WebAPI应用程序传输文件数据时使用断点续传以及多线程下载。

它允许提供ETag标题以及Last-Modified标题。 它还支持以下前置条件标题:If-MatchIf-None-MatchIf-Modified-SinceIf-Unmodified-SinceIf-Range

支持 ASP.NET Core 2.0

从.NET Core2.0开始,ASP.NET Core内部支持断点续传。 因此删除了与断点续传相关的所有代码。 只留下了“Content-Disposition” Inline的一部分。 现在所有代码都依赖于基础.NET类。 还删除了对多部分请求的支持。 为了支持我将不得不复制很多原始代码,因为目前没有办法简单地覆盖基类的某些部分。

如何使用

.NET Framework

在你的控制器中,你可以像在FileResult帮助器中构建一样使用它。

        using Masuit.Tools.Mvc;
        using Masuit.Tools.Mvc.ResumeFileResult;

        private readonly MimeMapper mimeMapper=new MimeMapper(); // 推荐使用依赖注入

        public ActionResult ResumeFileResult()
        {
            var path = Server.MapPath("~/Content/test.mp4");
            return new ResumeFileResult(path, mimeMapper.GetMimeFromPath(path), Request);
        }

        public ActionResult ResumeFile()
        {
            return this.ResumeFile("~/Content/test.mp4", mimeMapper.GetMimeFromPath(path), "test.mp4");
        }

        public ActionResult ResumePhysicalFile()
        {
            return this.ResumePhysicalFile(@"D:/test.mp4", mimeMapper.GetMimeFromPath(@"D:/test.mp4"), "test.mp4");
        }

Asp.Net Core

要使用ResumeFileResults,必须在Startup.csConfigureServices方法调用中配置服务:

        using Masuit.Tools.AspNetCore.ResumeFileResults.DependencyInjection;
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddResumeFileResult();
        }

然后在你的控制器中,你可以像在FileResult帮助器中构建一样使用它。

        using Masuit.Tools.AspNetCore.ResumeFileResults.Extensions;
        private const string EntityTag = "\"TestFile\"";

        private readonly IHostingEnvironment _hostingEnvironment;

        private readonly DateTimeOffset _lastModified = new DateTimeOffset(2016, 1, 1, 0, 0, 0, TimeSpan.Zero);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="hostingEnvironment"></param>
        public TestController(IHostingEnvironment hostingEnvironment)
        {
            _hostingEnvironment = hostingEnvironment;
        }

        [HttpGet("content/{fileName}/{etag}")]
        public IActionResult FileContent(bool fileName, bool etag)
        {
            string webRoot = _hostingEnvironment.WebRootPath;
            var content = System.IO.File.ReadAllBytes(Path.Combine(webRoot, "TestFile.txt"));
            ResumeFileContentResult result = this.ResumeFile(content, "text/plain", fileName ? "TestFile.txt" : null, etag ? EntityTag : null);
            result.LastModified = _lastModified;
            return result;
        }

        [HttpGet("content/{fileName}")]
        public IActionResult FileContent(bool fileName)
        {
            string webRoot = _hostingEnvironment.WebRootPath;
            var content = System.IO.File.ReadAllBytes(Path.Combine(webRoot, "TestFile.txt"));
            var result = new ResumeFileContentResult(content, "text/plain")
            {
                FileInlineName = "TestFile.txt",
                LastModified = _lastModified
            };
            return result;
        }

        [HttpHead("file")]
        public IActionResult FileHead()
        {
            ResumeVirtualFileResult result = this.ResumeFile("TestFile.txt", "text/plain", "TestFile.txt", EntityTag);
            result.LastModified = _lastModified;
            return result;
        }

        [HttpPut("file")]
        public IActionResult FilePut()
        {
            ResumeVirtualFileResult result = this.ResumeFile("TestFile.txt", "text/plain", "TestFile.txt", EntityTag);
            result.LastModified = _lastModified;
            return result;
        }

        [HttpGet("stream/{fileName}/{etag}")]
        public IActionResult FileStream(bool fileName, bool etag)
        {
            string webRoot = _hostingEnvironment.WebRootPath;
            FileStream stream = System.IO.File.OpenRead(Path.Combine(webRoot, "TestFile.txt"));

            ResumeFileStreamResult result = this.ResumeFile(stream, "text/plain", fileName ? "TestFile.txt" : null, etag ? EntityTag : null);
            result.LastModified = _lastModified;
            return result;
        }

        [HttpGet("stream/{fileName}")]
        public IActionResult FileStream(bool fileName)
        {
            string webRoot = _hostingEnvironment.WebRootPath;
            FileStream stream = System.IO.File.OpenRead(Path.Combine(webRoot, "TestFile.txt"));

            var result = new ResumeFileStreamResult(stream, "text/plain")
            {
                FileInlineName = "TestFile.txt",
                LastModified = _lastModified
            };

            return result;
        }

        [HttpGet("physical/{fileName}/{etag}")]
        public IActionResult PhysicalFile(bool fileName, bool etag)
        {
            string webRoot = _hostingEnvironment.WebRootPath;

            ResumePhysicalFileResult result = this.ResumePhysicalFile(Path.Combine(webRoot, "TestFile.txt"), "text/plain", fileName ? "TestFile.txt" : null, etag ? EntityTag : null);
            result.LastModified = _lastModified;
            return result;
        }

        [HttpGet("physical/{fileName}")]
        public IActionResult PhysicalFile(bool fileName)
        {
            string webRoot = _hostingEnvironment.WebRootPath;

            var result = new ResumePhysicalFileResult(Path.Combine(webRoot, "TestFile.txt"), "text/plain")
            {
                FileInlineName = "TestFile.txt",
                LastModified = _lastModified
            };

            return result;
        }

        [HttpGet("virtual/{fileName}/{etag}")]
        public IActionResult VirtualFile(bool fileName, bool etag)
        {
            ResumeVirtualFileResult result = this.ResumeFile("TestFile.txt", "text/plain", fileName ? "TestFile.txt" : null, etag ? EntityTag : null);
            result.LastModified = _lastModified;
            return result;
        }

以上示例将为您的数据提供“Content-Disposition:attachment”。 当没有提供fileName时,数据将作为“Content-Disposition:inline”提供。 另外,它可以提供ETagLastModified标题。

        [HttpGet("virtual/{fileName}")]
        public IActionResult VirtualFile(bool fileName)
        {
            var result = new ResumeVirtualFileResult("TestFile.txt", "text/plain")
            {
                FileInlineName = "TestFile.txt",
                LastModified = _lastModified
            };
            return result;
        }