前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >asp dotnet core 支持客户端上传文件

asp dotnet core 支持客户端上传文件

作者头像
林德熙
发布2019-03-13 11:27:22
6.3K0
发布2019-03-13 11:27:22
举报
文章被收录于专栏:林德熙的博客林德熙的博客

本文告诉大家如何在 asp dotnet core 支持客户端上传文件

新建一个 asp dotnet core 程序,创建一个新的类,用于给客户端上传文件的信息

代码语言:javascript
复制
    public class KanajeaLolowge
    {
        public IFormFile File { get; set; }

        public string Sha { get; set; }
    }

这个类包含两个信息,一个是 File 文件,另一个是文件校验,这个类可以随意命名,属性也可以随意命名,只要在客户端可以相同

打开一个 controller 添加一个新的函数

代码语言:javascript
复制
        [HttpPost("UploadPackage")]
        public async Task<StatusCodeResult> UploadPackage([FromForm]KanajeaLolowge file)
        {
      
            return Ok();
        }

在这个函数添加特性 HttpPost 里面的参数就是访问链接,如上面的代码,加入所在的类是这样定义

代码语言:javascript
复制
    [Route("api/[controller]")]
    [ApiController]
    public class GairKetemRairsemsController : ControllerBase

那么可以通过 api/GairKetemRairsems/UploadPackage 访问这个函数

在函数传入的参数使用 [FromForm]KanajeaLolowge file 的意思是通过 Post 提交 Form 的方法拿到参数

所以在客户端通过 Form 提交包含 File 和 Sha 信息的 Form 就可以通过链接调用这个方法

请看在客户端如何写

假设已经拿到文件的 FileStream 和计算出文件的 Sha 拿到链接

代码语言:javascript
复制
        private static async Task Upload(FileStream fileStream, string sha, string url)

在这个方法上传文件,通过 MultipartFormDataContent 构造一个 Form 请看代码

代码语言:javascript
复制
            var multipartFormDataContent = new MultipartFormDataContent();
            multipartFormDataContent.Add(new StreamContent(fileStream), "File", fileName: "文件名.png");
            multipartFormDataContent.Add(new StringContent(sha), "Sha");

文件通过 StreamContent 传入 Stream 的值,加上的 File 参数是和 asp dotnet core 的上传类对应的属性名,最后的一个 fileName 指的是文件名,因为传入的是 Stream 可能是内存流,这时就无法拿到文件名,需要用户传入

下面的值是传入一个 Key value 的值,这里的 key 是 "Sha" 值是 sha 的值

创建一个 HttpClient 上传 Form 代码

代码语言:javascript
复制
            var httpClient = new HttpClient();
            await httpClient.PostAsync(url, multipartFormDataContent);

这样调用这个 PostAsync 在 Asp dotnet core 就调用 UploadPackage 方法

通过这个方法就可以做到在 asp dotnet core 上传文件

获取文件 Sha 的方法请看下面

代码语言:javascript
复制
            var fileStream = fileInfo.OpenRead();
            string fileSha;
            using (var sha = SHA256.Create())
            {
                fileSha = Convert.ToBase64String(sha.ComputeHash(fileStream));

                fileStream.Seek(0, SeekOrigin.Begin);
            }

注意需要 fileStream 还原,也就是 fileStream.Seek(0, SeekOrigin.Begin) 如果没有添加,那么上传的 Stream 是没有长度

在 asp dotnet core 接收文件,然后校验文件的方法请看下面

代码语言:javascript
复制
       [HttpPost("UploadPackage")]
        public async Task<StatusCodeResult> UploadPackage([FromForm]KanajeaLolowge file)
        {
            var fileInfo = new FileInfo("E:\\1.png");

            var fileStream = fileInfo.Open(FileMode.Create, FileAccess.ReadWrite);

            await file.File.CopyToAsync(fileStream);

            fileStream.Seek(0, SeekOrigin.Begin);

            string fileSha;
            using (var sha = SHA256.Create())
            {
                fileSha = Convert.ToBase64String(sha.ComputeHash(fileStream));

                fileStream.Seek(0, SeekOrigin.Begin);
            }

            if (fileSha == file.Sha)
            {
                return Ok();
            }

            return BadRequest();
        }

如果需要将文件保存在 ContentRoot 可以通过在 controller 的构造函数添加 IHostingEnvironment 参数,在 IHostingEnvironment 参数拿到 ContentRootPath 值

代码语言:javascript
复制
        public GairKetemRairsemsController(IHostingEnvironment hostingEnvironment)
        {
            _context = context;
            _hostingEnvironment = hostingEnvironment;
        }
       
        private readonly IHostingEnvironment _hostingEnvironment;

在保存文件可以使用下面代码

代码语言:javascript
复制
            var fileInfo = new FileInfo(Path.Combine(_hostingEnvironment.ContentRootPath, "1.png"));

ASP.NET Core文件上传与下载(多种上传方式) - GuZhenYin - 博客园

File uploads in ASP.NET Core


本文会经常更新,请阅读原文: https://lindexi.gitee.io/post/asp-dotnet-core-%E6%94%AF%E6%8C%81%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议
知识共享许可协议

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://lindexi.gitee.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档