2019-8-31-asp-dotnet-core-支持客户端上传文件
| 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"));
2019-8-31-asp-dotnet-core-支持客户端上传文件的更多相关文章
- asp dotnet core 支持客户端上传文件
本文告诉大家如何在 asp dotnet core 支持客户端上传文件 新建一个 asp dotnet core 程序,创建一个新的类,用于给客户端上传文件的信息 public class Kanaj ...
- ASP.NET Core MVC如何上传文件及处理大文件上传
用文件模型绑定接口:IFormFile (小文件上传) 当你使用IFormFile接口来上传文件的时候,一定要注意,IFormFile会将一个Http请求中的所有文件都读取到服务器内存后,才会触发AS ...
- asp.net core流式上传大文件
asp.net core流式上传大文件 首先需要明确一点就是使用流式上传和使用IFormFile在效率上没有太大的差异,IFormFile的缺点主要是客户端上传过来的文件首先会缓存在服务器内存中,任何 ...
- asp.net 客户端上传文件全路径获取方法
asp.net 获取客户端上传文件全路径方法: eg:F:\test\1.doc 基于浏览器安全问题,浏览器将屏蔽获取客户端文件全路径的方法,只能获取到文件的文件名,如果需要获取全路径则需要另想其他 ...
- Http请求之基于HttpUrlConnection,支持Header,Body传值,支持Multipart上传文件:
Http请求之基于HttpUrlConnection,支持Header,Body传值,支持Multipart上传文件: public static String post(String actionU ...
- asp.net中FileUpload得到上传文件的完整路径
asp.net中FileUpload得到上传文件的完整路径 Response.Write("完整路径:" + Server.MapPath(FileUpload1.PostedFi ...
- ASP.NET MVC 4 批量上传文件
上传文件的经典写法: <form id="uploadform" action="/Home/UploadFile" method="post& ...
- ASP.NET MVC 4 Ajax上传文件
这两天一直纠结着表单的问题.想在一个表单里实现三个功能: 输入查询条件,点击查询: 导出查询数据: 上传文件: 方法有很多,乱花渐欲迷人眼,尝试了很多,无果.大致说的是,给不同按钮写js代码,在js代 ...
- asp.net 一般处理程序接收上传文件的问题
在使用Html+ashx处理文件上传时,遇到上传文件超过4M的问题,首先HTML代码如下: <!DOCTYPE html> <html> <head> <me ...
随机推荐
- light oj 1068 数位dp
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> ...
- java普通for循环和for-each迭代循环的区别
PO实体类User: package aA; public class User { private String name; private int many; private int id; pu ...
- springboot整合mybatis通用Mapper
参考: https://blog.csdn.net/x18707731829/article/details/82814095 https://www.jianshu.com/p/6d2103451d ...
- Leetcode162. Find Peak Element寻找峰值
示例 2: 输入: nums = [1,2,1,3,5,6,4] 输出: 1 或 5 解释: 你的函数可以返回索引 1,其峰值元素为 2: 或者返回索引 5, 其峰值元素为 6. 说明: 你的解法 ...
- C++11的for循环的新用法
字符串 string str = "this is a string"; for(auto ch : str) cout << ch << endl; 等价 ...
- Redis源码解析:16Resis主从复制之主节点的完全重同步流程
主从复制过程中,主节点根据从节点发来的命令执行相应的操作.结合上一章中讲解的从节点在主从复制中的流程,本章以及下一篇文章讲解一下主节点在主从复制过程中的流程. 本章主要介绍完全重同步流程. 一:从节点 ...
- 用Python的requests库作接口测试——上传文件
POST一个多部分编码(Multipart-Encoded)的文件 Requests使得上传多部分编码文件变得很简单: >>> url = 'http://httpbin.org/p ...
- Liferay 7:Liferay内部博客地址
想要了解Liferay最新功能和特性,可以看一看. 非常实用,都是Liferay开发者写的: https://web.liferay.com/zh/community/blogs/all
- ECMAScript 6 (浅显入门)
1.let:ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为unde ...
- window 导入sql 防止乱码
第一步:创建数据库 create database if not exists db_news default charset utf8 collate utf8_general_ci; 第二步:设置 ...