.Net Core 图片上传FormData和Base64

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

1.Net Core MVC Form提交方式:

前端页面 form表单提交:

 1 <form  id="uploadForm">
 2 图片上传: <input type="file" name="file" multiple value="选择"  onchange="doUpload()" id="ajaxfile" />
 3 </form>
 4 <script type="text/javascript">
 5             //图片上传
 6             function doUpload()
 7             {
 8             var formData = new FormData($("#uploadForm")[0]);
 9             $.ajax({
10                 url: ‘@Url.Action("FileSave", "FileUpload")‘,
11                 type: ‘POST‘,
12                 data: formData,
13                 async: false,
14                 cache: false,
15                 contentType: false,
16                 processData: false,
17                 success: function (returndata) {
18                     //成功后执行的方法
19                 },
20                 error: function (returndata) {
21                     //上传失败执行的方法
22                 }
23             });
24         }
25 </script>

后端方法:

采用的流式处理,请求收到文件,然后应用直接处理或者保存。这种传输无法提高性能,但优点是可降低上传时对内存或磁盘空间的需求。

通过流(stream)把请求收到的文件拷贝到系统指定的文件中。

 1
 2         [HttpPost]
 3         public async Task<IActionResult> FileSave()
 4         {
 5             //获取Form提交的文件
 6             var files = Request.Form.Files;
 7             long size = files.Sum(f => f.Length);
 8             string webRootPath = _hostingEnvironment.WebRootPath; //物理路径
 9             string contentRootPath = _hostingEnvironment.ContentRootPath;
10             string showfilePath = "";
11             foreach (var formFile in files)
12             {
13                 if (formFile.Length > 0)
14                 {
15                     int count = formFile.FileName.Split(‘.‘).Length;
16                     string fileExt = formFile.FileName.Split(‘.‘)[count - 1]; //文件扩展名,不含“.”
17                     long fileSize = formFile.Length; //获得文件大小,以字节为单位
18                     string newFileName = System.Guid.NewGuid().ToString() + "." + fileExt;  //随机生成新的文件名
19                     #region 文件夹不存在则创建
20                     var filePath = webRootPath + "/upload";
21                     if (!Directory.Exists(filePath))
22                     {
23                         Directory.CreateDirectory(filePath);
24                     }
25                     #endregion
26                     #region 文件不存在则新建
27                     filePath = webRootPath + "/upload/" + newFileName;
28                     showfilePath = "upload/" + newFileName;
29                     FileHelper.CreateFile(filePath);
30                     #endregion
31                     //把上传的图片复制到指定的文件中
32                     using (var stream = new FileStream(filePath, FileMode.Create))
33                     {
34                         await formFile.CopyToAsync(stream);
35                     }
36                 }
37             }
38             return Ok(new { count = files.Count, savepath = showfilePath });
39         }

2.基于Base64的方式

前端用Vue提交,调用后端接口

vue提交用FormData方式,params方提交的参数会放到Url末尾,导致过长超出,这里用FormData的方式提交

提交时传递的参数要通过FormData对象来添加

Vue提交方法:

 1 //上传图片
 2
 3 afterRead(file) {
 4   // 此时可以自行将文件上传至服务器
 5   let obj={};
 6   var imgurl=file.content
 7    //需要将文件的地址 需要去掉base64头部标签 这里简单用replace替换
 8   imgurl =  imgurl.replace("data:image/jpeg;base64,", "");
 9     //获取图片的格式
10   var Img=file.file.name.split(‘.‘)[1]
11
12     //创建formdata对象 传递参数
13   var formdata=new FormData();
14   formdata.append("fileBase64",imgurl);//添加一条数据
15   formdata.append("fileExt",Img);//添加一条数据
16
17   //ajax调用接口,ajax的参数配置
18   this.$ajax({
19     method: ‘post‘,
20     dataType:‘json‘,
21     url: "http://*****/FileUpload/UploadBase64",
22     contentType : false,// 告诉jQuery不要去设置Content-Type请求头
23     processData: false,// 告诉jQuery不要去处理发送的数据,
24     beforeSend : function(req) {
25       req.setRequestHeader(‘Content-Type‘, ‘application/json‘);  ///加这一行解决问题
26     },
27      data: formdata
28   }).then(res=>{
29     //图片上传成功后 执行的操作
30      var msg=res.data.msg
31
32   }).catch(error =>{
33     console.log(error)
34   })
35 },

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

 1  [HttpPost]
 2
 3         public string  UploadBase64(string fileBase64,string fileExt)
 4         {
 5             TableData data = new TableData();
 6             byte[] bytes = ToBytes_FromBase64Str(fileBase64);
 7             //var fileExtension = Path.GetExtension(fileName);
 8
 9             string webRootPath = _hostingEnvironment.WebRootPath;
10             string newFileName = System.Guid.NewGuid().ToString() + "." + fileExt; //随机生成新的文件名
11
12             var filePath = webRootPath + "/upload";
13             var RetfilePath =  "upload/" + newFileName;
14             if (!Directory.Exists(filePath))
15             {
16                 Directory.CreateDirectory(filePath);
17             }
18             filePath = webRootPath + "/upload/" + newFileName;
19             try
20             {
21                 data.code = 200;
22                 FileStream fs = new FileStream(filePath, FileMode.CreateNew);
23                 fs.Write(bytes, 0, bytes.Length);
24                 fs.Close();
25                 data.msg = RetfilePath;
26             }
27             catch (Exception ex)
28             {
29                 data.code = 500;
30                 data.msg = "newFileName:"+ newFileName+"Error:"+ex.Message;
31             }
32             return JsonHelper.Instance.Serialize(data);
33         }

附:FileHelper类 和TableData

 1  public static class FileHelper
 2     {
 3
 4         /// <summary>
 5         /// 拷贝文件
 6         /// </summary>
 7         /// <param name="orignFile">原始文件</param>
 8         /// <param name="newFile">新文件路径</param>
 9         public static void FileCoppy(string orignFile, string newFile)
10         {
11             if (string.IsNullOrEmpty(orignFile))
12             {
13                 throw new ArgumentException(orignFile);
14             }
15             if (string.IsNullOrEmpty(newFile))
16             {
17                 throw new ArgumentException(newFile);
18             }
19             System.IO.File.Copy(orignFile, newFile, true);
20         }
21         /// <summary>
22         /// 删除文件
23         /// </summary>
24         /// <param name="path">路径</param>
25         public static void FileDel(string path)
26         {
27             if (string.IsNullOrEmpty(path))
28             {
29                 throw new ArgumentException(path);
30             }
31             System.IO.File.Delete(path);
32         }
33         /// <summary>
34         /// 移动文件
35         /// </summary>
36         /// <param name="orignFile">原始路径</param>
37         /// <param name="newFile">新路径</param>
38         public static void FileMove(string orignFile, string newFile)
39         {
40             if (string.IsNullOrEmpty(orignFile))
41             {
42                 throw new ArgumentException(orignFile);
43             }
44             if (string.IsNullOrEmpty(newFile))
45             {
46                 throw new ArgumentException(newFile);
47             }
48             System.IO.File.Move(orignFile, newFile);
49         }
50         //创建路径
51         public static void CreatePath(string FilePath)
52         {
53             if (!Directory.Exists(FilePath))
54             {
55                 Directory.CreateDirectory(FilePath);
56             }
57         }
58         //创建文件
59         public static void CreateFile(string FilePath)
60         {
61             if (!File.Exists(FilePath))
62             {
63                 FileStream fs = File.Create(FilePath);
64                 fs.Close();
65             }
66         }
67     }
 1    public class TableData
 2     {
 3         /// <summary>
 4         /// 状态码
 5         /// </summary>
 6         public int code;
 7         /// <summary>
 8         /// 操作消息
 9         /// </summary>
10         public string msg;
11         /// <summary>
12         /// 总记录条数
13         /// </summary>
14         public int count;
15
16         /// <summary>
17         /// 数据内容
18         /// </summary>
19         public dynamic data;
20         public TableData()
21         {
22             code = 200;
23             msg = "加载成功";
24
25         }
26     }

演示效果如下:

原文地址:https://www.cnblogs.com/ywkcode/p/11703523.html

时间: 2024-11-07 00:02:43

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

input file图片上传FormData

FormData() 上传图片,转载请注明出处!!! $("#updatepic").on("change", function(e) { var file = e.target.files[0]; var fd = new FormData(); if (file.size < 4194304) { //判断文件大小 fd.append("UserName", "wangteng"); fd.append("

移动端图片上传老失败

做移动端开发的时候,form里面的file后台经常获取不到,用foemdata也拿不到 找到了一个formdata的脚本 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-s

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

之前发了一篇关于自己看待前端组件化的文章,但是由于学习和实践的业务逻辑差异,所以自己练习的一些demo逻辑比较简单,打算用vue重构现在公司做的项目,所以在一些小的功能页面上使用vue来做的,现在写的这个是项目中用户反馈功能而来的,收获还是挺多的. 收获:dom操作=>数据操作       router的使用       组件的使用,具体总结放在尾部. 功能:1.上传图片 2.显示缩略图 3.可以删除 4.可以重新选择文件 先上成品图(主要抽取图片这块),自己在家主要做的功能,样式就不计较了.

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

七牛图片上传 SDK(.NET 版本):https://developer.qiniu.com/kodo/sdk/1237/csharp UpoladService示例代码: public class UpoladService : IUpoladService {     private readonly static string[] _imageExtensions = new string[] { ".jpg", ".png", ".gif&quo

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

asp.net core 通过ajax上传图片 .net core前端代码,因为是通过ajax调用,首先要保证ajax能调用后台代码,具体参见上一篇.net core 使用ajax调用后台代码. 前端代码如下: @Html.AntiForgeryToken() @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} <div> <form id="uploadForm">

使用canvas给图片添加水印, canvas转换base64,,canvas,图片,base64等转换成二进制文档流的方法,并将合成的图片上传到服务器,

一,前端合成带水印的图片 一般来说,生成带水印的图片由后端生成,但不乏有时候需要前端来处理.当然,前端处理图片一般不建议,一方面js的处理图片的方法不全,二是有些老版本的浏览器对canvas的支持度不够. 下面我们就说说,利用canvas 生成带水印的图片. 1.我们要实现一下效果 2.创建一个canvas var canvas = document.createElement('canvas'); var time = new Date(); var logoCanvas =time+' '+

.net core CKEditor 图片上传

最近在玩 asp.net core,不想用UEditor,想使用CKEditor.故需要图片上传功能. 废话不多说,先上效果图: CKEditor 前端代码: <text id="content" name="content"></text> <script> CKEDITOR.replace('content'); </script> CKeditor config.js 配置代码:需要配置图片上传路径 CKEDIT

MVC微信浏览器图片上传(img转Base64)

因公司业务需要,需要做一个微信公众号里的图片上传功能,主要用到的技术就是 img转base64 上到服务器 话不多说, 贴代码 先看前端显示出来的东西 OK 图片不重要,看代码 <!--微信图片上传--> <section class="logo-license"> <div class="half"> <div class="uploader"> <a class="license

js实现图片上传预览功能,使用base64编码来实现

实现图片上传的方法有很多,这里我们介绍比较简单的一种,使用base64对图片信息进行编码,然后直接将图片的base64信息存到数据库. 但是对于系统中需要上传的图片较多时并不建议采用这种方式,我们一般会选择存图片路径的方式,这样有助于减小数据库压力,base64 编码后的图片信息是一个很长的字符串,一般我们使用longText类型来将其存入数据库. html代码如下: <div class="col-sm-6"> <img id="headPortraitI