zoukankan      html  css  js  c++  java
  • 文件上传三:base64文件上传

    介绍三种上传方式:

    文件上传一:伪刷新上传

    文件上传二:FormData上传

    文件上传三:base64编码上传

    优点:

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

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

    缺点:

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

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

     1 <!DOCTYPE html>
     2 <html xmlns="http://www.w3.org/1999/xhtml">
     3 <head>
     4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     5     <title></title>
     6     <style>
     7         td {
     8             padding: 10px;
     9         }
    10     </style>
    11 </head>
    12 <body>
    13 
    14     <table>
    15         <tr>
    16             <td>选择图片:</td>
    17             <td><input type="file" id="file1" /></td>
    18         </tr>
    19         <tr>
    20             <td>原图预览:</td>
    21             <td id="ytyl"></td>
    22         </tr>
    23         <tr>
    24             <td></td>
    25             <td><input type="button" value="压缩" id="btnYaSuo" /></td>
    26         </tr>
    27         <tr>
    28             <td>压缩预览:</td>
    29             <td id="ysyl"></td>
    30         </tr>
    31         <tr>
    32             <td></td>
    33             <td><input type="button" value="上传" id="btnUpload" /></td>
    34         </tr>
    35     </table>
    36 
    37     <canvas id="myCanvas" style="display:none">
    38         Your browser does not support the HTML5 canvas tag.
    39     </canvas>
    40 
    41     <script>
    42 
    43         file1.onchange = function () {
    44             if (file1.files.length < 1 || !/image/w+/.test(file1.files[0].type)) {
    45                 //判断格式正则:/image/png/,/image/jpeg/,/image/gif/
    46                 alert("请确保文件为图像类型");
    47                 return;
    48             }
    49             var reader = new FileReader();
    50             reader.readAsDataURL(file1.files[0]);
    51             reader.onload = function (e) {
    52                 var result = e.target.result;
    53                 if (result && result.length > 0) {
    54                     ytyl.innerHTML = '<img src="' + result + '" id="img1" />';
    55                 }
    56             };
    57         };
    58 
    59         btnYaSuo.onclick = function () {
    60             var imgobj = document.getElementById("img1");
    61             var canvas = document.getElementById("myCanvas");
    62             canvas.width = imgobj.width;
    63             canvas.height = imgobj.height;
    64             var context = canvas.getContext("2d");
    65             context.drawImage(imgobj, 0, 0, canvas.width, canvas.height);
    66             //取值:image/jpeg、image/png(默认值)
    67             var dataUrl = canvas.toDataURL("image/jpeg", 0.9);
    68             ysyl.innerHTML = '<img src="' + dataUrl + '" id="img2" />';
    69         };
    70 
    71         btnUpload.onclick = function () {
    72             //var imgobj = document.getElementById("img1"); //未压缩的图像
    73             var imgobj = document.getElementById("img2");
    74             if (!imgobj) {
    75                 return;
    76             }
    77             //做为普通的字符串POST到服务端
    78             var data = { "FileData": imgobj.getAttribute("src") };
    79             //$.post("Handler1.ashx", data, function (res) { }, "json");
    80         };
    81 
    82     </script>
    83 
    84 </body>
    85 </html>

    Handler1.ashx的处理:

     1 public void ProcessRequest(HttpContext context)
     2         {
     3             string base64Code = context.Request.Form["FileData"];
     4             if (string.IsNullOrEmpty(base64Code))
     5             {
     6                 context.Response.Write("{"Msg":"请上传文件!"}");
     7                 context.Response.End();
     8             }
     9 
    10             string ext = string.Empty;
    11             if (base64Code.Contains("data:image/jpeg;base64,"))
    12             {
    13                 ext = ".jpg";
    14                 base64Code = base64Code.Substring(23);
    15             }
    16             else if (base64Code.Contains("data:image/png;base64,"))
    17             {
    18                 ext = ".png";
    19                 base64Code = base64Code.Substring(22);
    20             }
    21             else
    22             {
    23                 context.Response.Write("{"Msg":"文件格式只支持JPG、PNG!"}");
    24                 context.Response.End();
    25             }
    26 
    27             DateTime now = DateTime.Now;
    28             string fileName = Guid.NewGuid().ToString() + ext;
    29             string relPath = string.Format("/Upload/{0}{1}{2}/", now.Year.ToString(), now.Month.ToString(), now.Day.ToString());
    30             string absPath = HttpContext.Current.Request.MapPath("~" + relPath);
    31             if (!Directory.Exists(absPath))
    32             {
    33                 Directory.CreateDirectory(absPath);
    34             }
    35             byte[] arr = Convert.FromBase64String(base64Code);
    36             MemoryStream ms = new MemoryStream(arr);
    37             new Bitmap(ms).Save(absPath + fileName);
    38 
    39             context.Response.Write("{"Msg":"上传成功!","Path":"" + relPath + fileName + ""}");
    40             context.Response.End();
    41         }
  • 相关阅读:
    Java实现蓝桥杯 算法提高 线段和点
    Java实现蓝桥杯 算法提高 线段和点
    Java实现蓝桥杯 算法提高 线段和点
    Java实现第八届蓝桥杯国赛 数字划分
    Java实现第八届蓝桥杯国赛 数字划分
    Java实现第八届蓝桥杯国赛 数字划分
    Java实现第八届蓝桥杯国赛 数字划分
    Java实现第八届蓝桥杯国赛 数字划分
    Java实现蓝桥杯-算法提高 P1003
    必须得是一万小时的 刻意训练(deliberate practice)
  • 原文地址:https://www.cnblogs.com/shousiji/p/6979377.html
Copyright © 2011-2022 走看看