缓冲流式传输是上传文件的两种常用方案,这里主要演示流式传输。

1.Net Core MVC Form提交方式:
前端页面 form表单提交:
 <form  id="uploadForm">
图片上传: <input type="file" name="file" multiple value="选择" onchange="doUpload()" id="ajaxfile" />
</form>
<script type="text/javascript">
//图片上传
function doUpload()
{
var formData = new FormData($("#uploadForm")[]);
$.ajax({
url: '@Url.Action("FileSave", "FileUpload")',
type: 'POST',
data: formData,
async: false,
cache: false,
contentType: false,
processData: false,
success: function (returndata) {
//成功后执行的方法
},
error: function (returndata) {
//上传失败执行的方法
}
});
}
</script>
后端方法:
采用的流式处理,请求收到文件,然后应用直接处理或者保存。这种传输无法提高性能,但优点是可降低上传时对内存或磁盘空间的需求。
通过流(stream)把请求收到的文件拷贝到系统指定的文件中。
         [HttpPost]
public async Task<IActionResult> FileSave()
{
//获取Form提交的文件
var files = Request.Form.Files;
long size = files.Sum(f => f.Length);
string webRootPath = _hostingEnvironment.WebRootPath; //物理路径
string contentRootPath = _hostingEnvironment.ContentRootPath;
string showfilePath = "";
foreach (var formFile in files)
{
if (formFile.Length > )
{
int count = formFile.FileName.Split('.').Length;
string fileExt = formFile.FileName.Split('.')[count - ]; //文件扩展名,不含“.”
long fileSize = formFile.Length; //获得文件大小,以字节为单位
string newFileName = System.Guid.NewGuid().ToString() + "." + fileExt; //随机生成新的文件名
#region 文件夹不存在则创建
var filePath = webRootPath + "/upload";
if (!Directory.Exists(filePath))
{
Directory.CreateDirectory(filePath);
}
#endregion
#region 文件不存在则新建
filePath = webRootPath + "/upload/" + newFileName;
showfilePath = "upload/" + newFileName;
FileHelper.CreateFile(filePath);
#endregion
//把上传的图片复制到指定的文件中
using (var stream = new FileStream(filePath, FileMode.Create))
{
await formFile.CopyToAsync(stream);
}
}
}
return Ok(new { count = files.Count, savepath = showfilePath });
}
2.基于Base64的方式
前端用Vue提交,调用后端接口
vue提交用FormData方式,params方提交的参数会放到Url末尾,导致过长超出,这里用FormData的方式提交
提交时传递的参数要通过FormData对象来添加
Vue提交方法:
 //上传图片

 afterRead(file) {
// 此时可以自行将文件上传至服务器
let obj={};
var imgurl=file.content
//需要将文件的地址 需要去掉base64头部标签 这里简单用replace替换
imgurl = imgurl.replace("data:image/jpeg;base64,", "");
//获取图片的格式
var Img=file.file.name.split('.')[1] //创建formdata对象 传递参数
var formdata=new FormData();
formdata.append("fileBase64",imgurl);//添加一条数据
formdata.append("fileExt",Img);//添加一条数据 //ajax调用接口,ajax的参数配置
this.$ajax({
method: 'post',
dataType:'json',
url: "http://*****/FileUpload/UploadBase64",
contentType : false,// 告诉jQuery不要去设置Content-Type请求头
processData: false,// 告诉jQuery不要去处理发送的数据,
beforeSend : function(req) {
req.setRequestHeader('Content-Type', 'application/json'); ///加这一行解决问题
},
data: formdata
}).then(res=>{
//图片上传成功后 执行的操作
var msg=res.data.msg }).catch(error =>{
console.log(error)
})
},

后端方法:原理和1基本相同

  [HttpPost]

         public string  UploadBase64(string fileBase64,string fileExt)
{
TableData data = new TableData();
byte[] bytes = ToBytes_FromBase64Str(fileBase64);
//var fileExtension = Path.GetExtension(fileName); string webRootPath = _hostingEnvironment.WebRootPath;
string newFileName = System.Guid.NewGuid().ToString() + "." + fileExt; //随机生成新的文件名 var filePath = webRootPath + "/upload";
var RetfilePath = "upload/" + newFileName;
if (!Directory.Exists(filePath))
{
Directory.CreateDirectory(filePath);
}
filePath = webRootPath + "/upload/" + newFileName;
try
{
data.code = ;
FileStream fs = new FileStream(filePath, FileMode.CreateNew);
fs.Write(bytes, , bytes.Length);
fs.Close();
data.msg = RetfilePath;
}
catch (Exception ex)
{
data.code = ;
data.msg = "newFileName:"+ newFileName+"Error:"+ex.Message;
}
return JsonHelper.Instance.Serialize(data);
}

附:FileHelper类 和TableData

  public static class FileHelper
{ /// <summary>
/// 拷贝文件
/// </summary>
/// <param name="orignFile">原始文件</param>
/// <param name="newFile">新文件路径</param>
public static void FileCoppy(string orignFile, string newFile)
{
if (string.IsNullOrEmpty(orignFile))
{
throw new ArgumentException(orignFile);
}
if (string.IsNullOrEmpty(newFile))
{
throw new ArgumentException(newFile);
}
System.IO.File.Copy(orignFile, newFile, true);
}
/// <summary>
/// 删除文件
/// </summary>
/// <param name="path">路径</param>
public static void FileDel(string path)
{
if (string.IsNullOrEmpty(path))
{
throw new ArgumentException(path);
}
System.IO.File.Delete(path);
}
/// <summary>
/// 移动文件
/// </summary>
/// <param name="orignFile">原始路径</param>
/// <param name="newFile">新路径</param>
public static void FileMove(string orignFile, string newFile)
{
if (string.IsNullOrEmpty(orignFile))
{
throw new ArgumentException(orignFile);
}
if (string.IsNullOrEmpty(newFile))
{
throw new ArgumentException(newFile);
}
System.IO.File.Move(orignFile, newFile);
}
//创建路径
public static void CreatePath(string FilePath)
{
if (!Directory.Exists(FilePath))
{
Directory.CreateDirectory(FilePath);
}
}
//创建文件
public static void CreateFile(string FilePath)
{
if (!File.Exists(FilePath))
{
FileStream fs = File.Create(FilePath);
fs.Close();
}
}
}
    public class TableData
{
/// <summary>
/// 状态码
/// </summary>
public int code;
/// <summary>
/// 操作消息
/// </summary>
public string msg;
/// <summary>
/// 总记录条数
/// </summary>
public int count; /// <summary>
/// 数据内容
/// </summary>
public dynamic data;
public TableData()
{
code = ;
msg = "加载成功"; }
}

演示效果如下:

.Net Core 图片上传FormData和Base64的更多相关文章

  1. 项目回顾3-再谈图片上传-FormData+ajax上传

    上次在纠结图片上传用base64还是form表单,现在感觉好蠢,因为又开辟了第三条道路. 其实也根本用不到form 只需要一个上传文件的input就好了 <input id="file ...

  2. 项目中使用的图片上传方法,base64存本地

    //生成健康报告 public function uploadJkbg(Request $r) { $data = $r->all(); $jkbg['jkbg_ctime'] = time() ...

  3. TinyMCE编辑器图片上传扩展(base64方式),asp.net mvc5

    编辑器上传图片一般都是先上传到服务器中,若是用户取消或忘记提交表单就产生一张废图在空间里面,时间一长就产生大量占用空间的无用图片,现在就试试提交前先用base64,提交后,在后台处理编辑器内容中的&l ...

  4. VUE2.0+VUE-Router做一个图片上传预览的组件

    之前发了一篇关于自己看待前端组件化的文章,但是由于学习和实践的业务逻辑差异,所以自己练习的一些demo逻辑比较简单,打算用vue重构现在公司做的项目,所以在一些小的功能页面上使用vue来做的,现在写的 ...

  5. ASP.NET Core 简单实现七牛图片上传(FormData 和 Base64)

    ASP.NET Core 简单实现七牛图片上传(FormData 和 Base64) 七牛图片上传 SDK(.NET 版本):https://developer.qiniu.com/kodo/sdk/ ...

  6. .net core 基于multipart/form-data的文件上传,这里以图片上传为例

    首先传递的数据格式大概如下: 然后就可以在后端获取数据了:直接上代码了哈: [HttpPost]        ///分别获取 data数据和调用图片上传方法 public async Task< ...

  7. asp.net core 通过ajax上传图片及wangEditor图片上传

    asp.net core 通过ajax上传图片 .net core前端代码,因为是通过ajax调用,首先要保证ajax能调用后台代码,具体参见上一篇.net core 使用ajax调用后台代码. 前端 ...

  8. C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi

    C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...

  9. Asp.Net Core Web Api图片上传(一)集成MongoDB存储实例教程

    Asp.Net Core Web Api图片上传及MongoDB存储实例教程(一) 图片或者文件上传相信大家在开发中应该都会用到吧,有的时候还要对图片生成缩略图.那么如何在Asp.Net Core W ...

随机推荐

  1. 关于event 和 window.event问题及浏览器兼容问题

    < html> < script language="javascript"> function test(event) { event = event | ...

  2. poi导入读取时间格式问题

    万能处理方案: 所有日期格式都可以通过getDataFormat()值来判断 yyyy-MM-dd-----14 yyyy年m月d日--- 31 yyyy年m月-------57 m月d日  ---- ...

  3. 第08组 Alpha冲刺(2/4)

    队名 八组评分了吗 组长博客 小李的博客 作业博客 作业链接 组员1李昕晖(组长) 过去两天完成了哪些任务 文字/口头描述 11月17日了解各个小组的进度与难以攻破的地方,与隔壁第七组组长讨论进度发展 ...

  4. 南开大学2020年数学分析高等代数考研试题回忆版TeX排版

    南开大学2020年数学分析高等代数考研试题回忆版TeX排版 220328[南开大学2020年高等代数考研试题回忆版] 220329[南开大学2020年数学分析考研试题回忆版]

  5. [转]详解vue父组件传递props异步数据到子组件的问题

    原文地址:https://www.cnblogs.com/goloving/p/9114389.html 案例一 父组件parent.vue // asyncData为异步获取的数据,想传递给子组件使 ...

  6. Java13新特性 -- switch表达式

    引入了yield语句,用于返回值: 和return的区别在于:return会直接跳出当前循环或者方法,而yield只会跳出当前switch块. @Test public void testSwitch ...

  7. mysql查看连接情况

    1.使用navicat进入命令行或者命令行进入mysql 2.看所有进程 show full processlist; 3.看所有连接show status like 'Threads%';

  8. 123456123456----updateV#%#1%#%---pinLv###20%%%----com.zzj.ChildEnglis698---前show后广--儿童英语-111111111

    com.zzj.ChildEnglis698---前show后广--儿童英语-111111111

  9. kafka中的配额管理(限速)机制

    kafka支持配额管理,从而可以对Producer和Consumer的produce&fetch操作进行流量限制,防止个别业务压爆服务器.本文主要介绍如何使用kafka的配额管理功能. 1 K ...

  10. spring boot2X整合Consul一服务注册与发现

    Consul 是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置. 关键特性: 服务注册/发现 数据强一致性保证 多数据中心 健康检查 key/value存储 1.下载 htt ...