title author date CreateTime categories
asp dotnet core 支持客户端上传文件
lindexi
2019-08-31 16:55:58 +0800
2019-2-17 14:45:9 +0800
dotnet

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

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

    public class KanajeaLolowge
{
public IFormFile File { get; set; } public string Sha { get; set; }
}

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

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

        [HttpPost("UploadPackage")]
public async Task<StatusCodeResult> UploadPackage([FromForm]KanajeaLolowge file)
{ return Ok();
}

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

    [Route("api/[controller]")]
[ApiController]
public class GairKetemRairsemsController : ControllerBase

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

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

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

请看在客户端如何写

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

        private static async Task Upload(FileStream fileStream, string sha, string url)

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

            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 代码

            var httpClient = new HttpClient();
await httpClient.PostAsync(url, multipartFormDataContent);

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

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

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

            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 接收文件,然后校验文件的方法请看下面

       [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 值

        public GairKetemRairsemsController(IHostingEnvironment hostingEnvironment)
{
_context = context;
_hostingEnvironment = hostingEnvironment;
} private readonly IHostingEnvironment _hostingEnvironment;

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

            var fileInfo = new FileInfo(Path.Combine(_hostingEnvironment.ContentRootPath, "1.png"));

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

File uploads in ASP.NET Core

2019-8-31-asp-dotnet-core-支持客户端上传文件的更多相关文章

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

    本文告诉大家如何在 asp dotnet core 支持客户端上传文件 新建一个 asp dotnet core 程序,创建一个新的类,用于给客户端上传文件的信息 public class Kanaj ...

  2. ASP.NET Core MVC如何上传文件及处理大文件上传

    用文件模型绑定接口:IFormFile (小文件上传) 当你使用IFormFile接口来上传文件的时候,一定要注意,IFormFile会将一个Http请求中的所有文件都读取到服务器内存后,才会触发AS ...

  3. asp.net core流式上传大文件

    asp.net core流式上传大文件 首先需要明确一点就是使用流式上传和使用IFormFile在效率上没有太大的差异,IFormFile的缺点主要是客户端上传过来的文件首先会缓存在服务器内存中,任何 ...

  4. asp.net 客户端上传文件全路径获取方法

    asp.net  获取客户端上传文件全路径方法: eg:F:\test\1.doc 基于浏览器安全问题,浏览器将屏蔽获取客户端文件全路径的方法,只能获取到文件的文件名,如果需要获取全路径则需要另想其他 ...

  5. Http请求之基于HttpUrlConnection,支持Header,Body传值,支持Multipart上传文件:

    Http请求之基于HttpUrlConnection,支持Header,Body传值,支持Multipart上传文件: public static String post(String actionU ...

  6. asp.net中FileUpload得到上传文件的完整路径

    asp.net中FileUpload得到上传文件的完整路径 Response.Write("完整路径:" + Server.MapPath(FileUpload1.PostedFi ...

  7. ASP.NET MVC 4 批量上传文件

    上传文件的经典写法: <form id="uploadform" action="/Home/UploadFile" method="post& ...

  8. ASP.NET MVC 4 Ajax上传文件

    这两天一直纠结着表单的问题.想在一个表单里实现三个功能: 输入查询条件,点击查询: 导出查询数据: 上传文件: 方法有很多,乱花渐欲迷人眼,尝试了很多,无果.大致说的是,给不同按钮写js代码,在js代 ...

  9. asp.net 一般处理程序接收上传文件的问题

    在使用Html+ashx处理文件上传时,遇到上传文件超过4M的问题,首先HTML代码如下: <!DOCTYPE html> <html> <head> <me ...

随机推荐

  1. redis-cli启动问题

    首先需要找到redis的所在目录,然后将redis.conf复制到/etc/redis.conf 另外需要将redis.conf文件中的 daemonize no 设置为 daemonize yes. ...

  2. 代理模式(Proxy、Subject、RealSubject)(代购火车票)

    .(为其他对象提供一种代理以控制对这个对象的访问.) 在实际的软件开发中,我们经常面临着对一个对象进行访问控制的问题,由于跨越网络或安全方面等原因不能直接或不需要直接被访问,直接访问的代价会给系统带来 ...

  3. 2019-7-9-Roslyn-如何在-Target-引用-xaml-防止文件没有编译

    title author date CreateTime categories Roslyn 如何在 Target 引用 xaml 防止文件没有编译 lindexi 2019-07-09 17:16: ...

  4. /etc/inittab配置文件详解

    init的进程号是1,从这一点就能看出,init进程是系统所有进程的起点,Linux在完成核内引导以后,就开始运行init程序,init程序需要读取设置文件/etc/inittab.inittab是个 ...

  5. SELinux安全方式

    一.SElinux配置文件 在CentOS 7系统中部署SELinux非常简单,由于SELinux已经作为模块集成到内核中,默认SELinux已经处于激活状态.对管理员来说,更多的是需要配置与管理SE ...

  6. PHP学习1.5-预定义超全局数组变量

    1.PHP 预定义的超全局变量数组 特性: a.特殊的数组,操作方式没有区别 b.不用声明,php脚本中默认存在,因为在php中不用定义,所以在自定义变量是应避免和预定的全局变量同名 c.在全局范围内 ...

  7. shell mysql数据迁移/备份

    保存为.sh文件,配置运行即可 #!/bin/bash #### change the values below where needed..... #### 多数据库DBNAMES="My ...

  8. 玩转webpack之webpack的基本知识

    相信看了gulp教程的小伙伴肯定都可以很容易的掌握gulp了.它已经没有什么可以值得去思考的东西了,如果你已经看懂它就是单纯的在布置任务,然后利用插件的功能去执行任务.最后发布任务,pipe的理念来和 ...

  9. 在C#应用中使用Common Logging日志接口

    我在C#应用中一般使用log4net来记录日志,但如果项目中有个多个工程,那么没有工程都需要引用log4neg,感觉很不爽.不过今日在开spring.net的时候,看到了有个通用日志接口Common ...

  10. 关于neo4j的嵌入式和驱动包模式该如何选择,还请解惑

    看了网上的一些资料和Neo4j权威指南这本书.与图遍历相关的介绍都是基于嵌入式模式下的java Api.但是个人觉得在实际的项目中,嵌入式的模式,代码必须放在数据库所在服务器上,且服务器的启停操作都在 ...