介绍三种上传方式:

文件上传一:伪刷新上传

文件上传二:FormData上传

文件上传三:base64编码上传

优点:

1.浏览器可以马上展示图像,不需要先上传到服务端,减少服务端的垃圾图像

2.前端可以压缩、处理后上传到服务端,减少传输过程中的等待时间和服务器压力

缺点:

1.生成编码后保存成图片,倘若不做处理,会比原来的图片容量大,具体原因,搜索关键词:Base64编码为什么会使数据量变大

2.图片越大生成的编码越多,编码越多开发者工具中查看它时卡顿越久,谷歌浏览器好点,360极速直接假死。也就是说会影响前端调试。

 <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<style>
td {
padding: 10px;
}
</style>
</head>
<body> <table>
<tr>
<td>选择图片:</td>
<td><input type="file" id="file1" /></td>
</tr>
<tr>
<td>原图预览:</td>
<td id="ytyl"></td>
</tr>
<tr>
<td></td>
<td><input type="button" value="压缩" id="btnYaSuo" /></td>
</tr>
<tr>
<td>压缩预览:</td>
<td id="ysyl"></td>
</tr>
<tr>
<td></td>
<td><input type="button" value="上传" id="btnUpload" /></td>
</tr>
</table> <canvas id="myCanvas" style="display:none">
Your browser does not support the HTML5 canvas tag.
</canvas> <script> file1.onchange = function () {
if (file1.files.length < 1 || !/image\/\w+/.test(file1.files[0].type)) {
//判断格式正则:/image\/png/,/image\/jpeg/,/image\/gif/
alert("请确保文件为图像类型");
return;
}
var reader = new FileReader();
reader.readAsDataURL(file1.files[0]);
reader.onload = function (e) {
var result = e.target.result;
if (result && result.length > 0) {
ytyl.innerHTML = '<img src="' + result + '" id="img1" />';
}
};
}; btnYaSuo.onclick = function () {
var imgobj = document.getElementById("img1");
var canvas = document.getElementById("myCanvas");
canvas.width = imgobj.width;
canvas.height = imgobj.height;
var context = canvas.getContext("2d");
context.drawImage(imgobj, 0, 0, canvas.width, canvas.height);
//取值:image/jpeg、image/png(默认值)
var dataUrl = canvas.toDataURL("image/jpeg", 0.9);
ysyl.innerHTML = '<img src="' + dataUrl + '" id="img2" />';
}; btnUpload.onclick = function () {
//var imgobj = document.getElementById("img1"); //未压缩的图像
var imgobj = document.getElementById("img2");
if (!imgobj) {
return;
}
//做为普通的字符串POST到服务端
var data = { "FileData": imgobj.getAttribute("src") };
//$.post("Handler1.ashx", data, function (res) { }, "json");
}; </script> </body>
</html>

Handler1.ashx的处理:

 public void ProcessRequest(HttpContext context)
{
string base64Code = context.Request.Form["FileData"];
if (string.IsNullOrEmpty(base64Code))
{
context.Response.Write("{\"Msg\":\"请上传文件!\"}");
context.Response.End();
} string ext = string.Empty;
if (base64Code.Contains("data:image/jpeg;base64,"))
{
ext = ".jpg";
base64Code = base64Code.Substring();
}
else if (base64Code.Contains("data:image/png;base64,"))
{
ext = ".png";
base64Code = base64Code.Substring();
}
else
{
context.Response.Write("{\"Msg\":\"文件格式只支持JPG、PNG!\"}");
context.Response.End();
} DateTime now = DateTime.Now;
string fileName = Guid.NewGuid().ToString() + ext;
string relPath = string.Format("/Upload/{0}{1}{2}/", now.Year.ToString(), now.Month.ToString(), now.Day.ToString());
string absPath = HttpContext.Current.Request.MapPath("~" + relPath);
if (!Directory.Exists(absPath))
{
Directory.CreateDirectory(absPath);
}
byte[] arr = Convert.FromBase64String(base64Code);
MemoryStream ms = new MemoryStream(arr);
new Bitmap(ms).Save(absPath + fileName); context.Response.Write("{\"Msg\":\"上传成功!\",\"Path\":\"" + relPath + fileName + "\"}");
context.Response.End();
}

文件上传三:base64编码上传的更多相关文章

  1. JS中使用base64编码上传下载文件

    下载文件:使用FileSaver.js   https://github.com/eligrey/FileSaver.js/blob/master/README.md 手机端UC浏览器无法下载  安卓 ...

  2. 文件上传 和 base64编码

    base64编码 1.关于Base64编码  :  https://www.cnblogs.com/liyiwen/p/3814968.html (个人猜测),file表单发送文件,肯定是将文件转换为 ...

  3. HTML5 JS 压缩图片,并取得图片的BASE64编码上传

    基本过程 1) 调用 FileReader 的 reader.readAsDataURL(img); 方法, 在其onload事件中, 将用户选择的图片读入 Image对象. 2) 在image对象的 ...

  4. 读取一个文件,将其Base64编码,每76个字符加一个换行(转)

    echo chunk_split(base64_encode(file_get_contents('base64.txt'))); 例子 1 本例分隔每个字符,并添加 ".": & ...

  5. 文件上传二:FormData上传

    介绍三种上传方式: 文件上传一:伪刷新上传 文件上传二:FormData上传 文件上传三:base64编码上传 Flash的方式也玩过,现在不推荐用了. 真正的异步上传,FormData的更多操作,请 ...

  6. 小谢第7问:js前端如何实现大文件分片上传、上传进度、终止上传以及删除服务器文件?

    文件上传一般有两种方式:文件流上传和base64方式上传,毫无疑问,当进行大文件上传时候,转为base64是不现实的,因此用formData方式结合文件流,直接上传到服务器 本文主要结合vue的来讲解 ...

  7. Base64编码知识详解

    在我们进行前端开发时,针对项目优化,常会提到一条:针对较小图片,合理使用Base64字符串替换内嵌,可以减少页面http请求. 并且还会特别强调下,必须是小图片,大小不要超过多少KB,等等. 那么,B ...

  8. java处理图片base64编码的相互转换

    转载自http://www.cnblogs.com/libra0920/p/5754356.html 直接上代码 import sun.misc.BASE64Decoder; import sun.m ...

  9. Java对网络图片/本地图片转换成Base64编码和解码

    一.将本地图片转换成Base64编码字符串 /** * 将本地图片转换成Base64编码字符串 * * @param imgFile 图片目录路径 * @return */ public static ...

随机推荐

  1. WCF 服务应用程序

    1. 创建 WCF 服务程序和客户端程序,参考如下: https://docs.microsoft.com/zh-cn/dotnet/framework/wcf/getting-started-tut ...

  2. 闲着没事,做个chrome浏览器插件,适合初学者

    时光偷走的,永远都是我们眼皮底下看不见的珍贵. 本插件功能:替换掉网页中的指定图片的src地址. 使用插件前: 使用插件后: 鲜花(闲话):这个网站的不加水印的图片连接被保存在,图片的data-ima ...

  3. JMeter FTP测试计划

    为了演示测试目的,我们将使用公共可用的FTP位置,可以使用它来测试文件的下载. 您可以使用市场上现有的任何可用的演示FTP位置.我们使用URL下的FTP位置: https://dlptest.com/ ...

  4. Vijos1788 第K大 [模拟]

    1.题意:给定N个数字,和一个值K,要求输出一组数据中第K大的数字,其中30%的测试点满足:n <= 100;60%的测试点满足:n <= 1000;100%的测试点满足:n <= ...

  5. SQLite3的使用(封装很长,直接使用sqlite3_open函数,LIBS += sqlite3.dll 即可)good

    1.下载sqlite3相关文件sqlite3.dll.sqlite3.h(可从http://download.csdn.net/detail/mingxia_sui/5249070下载),添加到工程的 ...

  6. MySQL基础之事务编程学习笔记

    MySQL基础之事务编程学习笔记 在学习<MySQL技术内幕:SQL编程>一书,并做了笔记.本博客内容是自己学了<MySQL技术内幕:SQL编程>事务编程一章之后,根据自己的理 ...

  7. Struts||IQ

    Here's question about struts2....... 1.struts2原理 初始的请求通过一条标准的过滤器链,到达 servlet 容器 ( 比如 tomcat 容器,WebSp ...

  8. nginx和keeplive实现负载均衡高可用

    一. Keeplive服务介绍 Keeplive期初是专门为LVS设计的,专门用来监控LVS集群系统中各个服务节点的状态,后来又加入VRRP的功能,因此除了配合LVS服务以外,也可以作为其他服务(ng ...

  9. CentOS 下 git 401 Unauthorized while accessing 问题解决

    The requested URL returned error: 401 Unauthorized while accessing 这个一般是旧版git的问题,需要安装新版的.CentOS 想下载最 ...

  10. Flink State Backends (状态后端)

    State Backends 的作用 有状态的流计算是Flink的一大特点,状态本质上是数据,数据是需要维护的,例如数据库就是维护数据的一种解决方案.State Backends 的作用就是用来维护S ...