tnblog
首页
视频
资源
登录

网页上传文件断点续传的实现,无视文件大小上传,以及datatables基本用法

3055人阅读 2018/12/11 21:11 总访问:30018 评论:0 收藏:0 手机
分类: js


             首先明白js是客户带执行代码,c#是服务器上执行代码。本地文件需要用到js处理,服务器端接受c#代码处理
1.HTML页面,文件信息列表用的是datatables.js 不用,那部分可不看:


  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FileUpload.aspx.cs" Inherits="LY.CIP.Component.VCS.FileUpload" %>
  2.  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4. <html xmlns="http://www.w3.org/1999/xhtml">
  5. <head runat="server">
  6.     <title></title>
  7.     <script src="media/js/jquery-3.1.1.min.js" type="text/javascript"></script>
  8.     <link href="media/css/jquery.dataTables.min.css" rel="stylesheet" type="text/css" />
  9.     <script src="media/js/jquery.dataTables.min.js" type="text/javascript"></script>
  10.     <script src="FromDataFileupload.js" type="text/javascript"></script>
  11.     <style type="text/css">
  12.         .text-center
  13.         {
  14.             text-align: center;
  15.         }
  16.         .text-left
  17.         {
  18.             text-align: left;
  19.         }
  20.         .text-right
  21.         {
  22.             text-align: right;
  23.         }
  24.         /* dataTables某些标题字体小一号,可以在标题<th><p>测试字体小一号</th>,就可以设置某些列特殊的样式 */
  25.         table.dataTable thead thtable.dataTable thead td
  26.         {
  27.             text-align: center;
  28.             font-weight: normal;
  29.             border-bottom0px solid #111;
  30.         }
  31.         body
  32.         {
  33.             font-size9pt;
  34.             font-family: 宋体;
  35.         }
  36.         td
  37.         {
  38.             font-size9pt;
  39.             font-family: 宋体;
  40.         }
  41.         span
  42.         {
  43.             font-size9pt;
  44.             font-family: 宋体;
  45.         }
  46.         button
  47.         {
  48.             font-size9pt;
  49.             font-family: 宋体;
  50.             cursor: pointer;
  51.             border-top#9bc5dd 1px solid;
  52.             height22px;
  53.             border-right#9bc5dd 1px solid;
  54.             background-imageurl(/Images/button_bg.jpg);
  55.             background-repeat: repeat-x;
  56.             border-bottom#9bc5dd 1px solid;
  57.             padding-bottom0px;
  58.             padding-top2px;
  59.             padding-left5px;
  60.             margin5px;
  61.             border-left#9bc5dd 1px solid;
  62.             padding-right5px;
  63.         }
  64.         input
  65.         {
  66.             font-size9pt;
  67.             font-family: 宋体;
  68.         }
  69.         select
  70.         {
  71.             font-size9pt;
  72.             font-family: 宋体;
  73.         }
  74.     </style>
  75. </head>
  76. <body>
  77.     
  78.     <div style="width: 96%; margin-left: 2%;">
  79.         <span style="color: #3b516d;">上传区域</span>
  80.         <div style="padding: 0px 0px 0px 5px; width: 100%; border: 1px #b5c7e8 solid">
  81.             <table style="width: 100%">
  82.                 <tr>
  83.                     <td style="text-align: right; width: 20%;">
  84.                         附件名:
  85.                     </td>
  86.                     <td style="width: 30%;">
  87.                         <input id="fjm" style="width: 100%;" />
  88.                     </td>
  89.                     <td style="text-align: right; width: 20%;">
  90.                         附件类型:
  91.                     </td>
  92.                     <td style="width: 30%;">
  93.                         <select id="types" style="width: 100%;">
  94.                             <% if (optoiondt != null)
  95.                                {
  96.                                    foreach (System.Data.DataRow item in optoiondt.Rows)
  97.                                    {%>
  98.                             <option value="<%=item["lookup_value_code"] %>">
  99.                                 <%=item["lookup_value_name"]%></option>
  100.                             <%  }
  101.                                }
  102.                             %>
  103.                         </select>
  104.                     </td>
  105.                 </tr>
  106.                 <tr>
  107.                 </tr>
  108.                 <tr>
  109.                     <td style="text-align: right;">
  110.                         附件上传:
  111.                     </td>
  112.                     <td style="text-align: left;">
  113.                         <input type="file" id="file" style="width: 100%;" />
  114.                     </td>
  115.                     <td style="text-align: right;">
  116.                         上传状态:
  117.                     </td>
  118.                     <td  style="text-align: left;">
  119.                      <span id="output" style="font-size: 12px; margin-left: 10px;">等待</span>
  120.                     </td>
  121.                 </tr>
  122.                 <tr>
  123.                     <td colspan="4" style="text-align: right;">
  124.                        <button id="upload" style="width: 65px;">
  125.                             上传</button>
  126.                         <button id="Button1" style="width: 65px;">
  127.                             暂停</button>
  128.                         <button id="Button2" style="width: 65px;">
  129.                             开始</button>
  130.                         <button id="Button3" style="width: 65px; ">
  131.                             取消</button>
  132.                     </td>
  133.                 </tr>
  134.             </table>
  135.         </div>
  136.         <span style="color: #3b516d;">附件区</span>
  137.         <div id="datablesd" style="border: 1px #b5c7e8 solid">
  138.         </div>
  139.     </div>
  140. </body>
  141. </html>

2.用js分段文件:

  1. var isload = 6//上传状态,初始状态6,上传状态0,暂停状态1,取消状态2
  2. var loadi = 0//上传位置
  3. var succeed = 0//已上传的位置
  4. var name = ''//文件名称
  5. var shardCount; //文件总片数
  6. var filenameing = ''//记录上个上传文件的名称
  7.  
  8.  
  9. //判断文件是否存在
  10. var isExistFile = function (url{
  11.     var relt = false;
  12.     try {
  13.         $.ajax({
  14.             url"Handler/FileUpload.ashx",
  15.             type"POST",
  16.             data: { isload"fly"filename: url },
  17.             asyncfalse,         //bu异步
  18.             success: function (result{
  19.                 if (result == "1") relt = true;
  20.             }
  21.         });
  22.     } catch (e) {
  23.  
  24.     }
  25.     return relt;
  26. };
  27.  
  28. var page = {
  29.     initfunction ({
  30.         var my = this;
  31.         // $("#upload").click($.proxy(my.upload, my));
  32.         $("#upload").on('click'function ({
  33.             if ($("#file")[0].files[0] == undefined) {
  34.                 alert("你还未选择上传文件!");
  35.                 return;
  36.             }
  37.             //选择文件的文件名
  38.             var filenamete = $("#file")[0].files[0].name;
  39.             //重置文件状态
  40.             if (filenameing != filenamete) {
  41.                 isload = 6;
  42.             }
  43.             //截取文件后缀
  44.             var nametype = filenamete.substring(filenamete.lastIndexOf(".") + 1, filenamete.length);
  45.             if ($("#fjm").val() == '' || $("#fjm").val() == undefined) { isload = 6return alert('请输入文件名再上传!'); }
  46.             name = $("#fjm").val() + '.' + nametype;        //文件名
  47.             //判断是否存在文件
  48.             if (isExistFile(name))
  49.             { return alert("该附件已存在请修改附件名!"); }
  50.             //判断文件是否正在上传
  51.             if (isload == 0) {
  52.                 return alert("该附件已在上传!");
  53.             }
  54.             //文件最开始上传时候:状态为0,上传进度为0,已上传的位置为0
  55.             isload = 0;
  56.             loadi = 0;
  57.             succeed = 0;
  58.             my.upload();
  59.         })
  60.         //暂停
  61.         $("#Button1").on('click'function ({
  62.             if (isload == 6) {
  63.                 return alert("你还未上传文件!");
  64.             }
  65.             isload = 1;
  66.         })
  67.         //开始
  68.         $("#Button2").on('click'function ({
  69.             if ($("#file")[0].files[0] == undefined) {
  70.                 alert("你还未选择上传文件!");
  71.                 return;
  72.             }
  73.             //选择文件的文件名
  74.             var filenamete = $("#file")[0].files[0].name;
  75.             //截取文件后缀
  76.             var nametype = filenamete.substring(filenamete.lastIndexOf(".") + 1, filenamete.length);
  77.             if ($("#fjm").val() == '' || $("#fjm").val() == undefined) { isload = 6return alert('请输入文件名再上传!'); }
  78.             name = $("#fjm").val() + '.' + nametype;        //文件名
  79.             //判断是否存在文件
  80.             if (isExistFile(name))
  81.                 return alert("该附件已存在请修改附件名!");
  82.             //判断文件是否正在上传
  83.             if (isload == 0) {
  84.                 return alert("该附件上传未暂停!");
  85.             }
  86.             //文件开始上传时候:状态为0,其他不变
  87.             isload = 0;
  88.             loadi = loadi - 1;
  89.             my.upload();
  90.         })
  91.         //取消
  92.         $("#Button3").on('click'function ({
  93.             if ($("#fjm").val() == '' || $("#fjm").val() == undefined) { isload = 6return alert('你还未上传!'); }
  94.             if ($("#file")[0].files[0] == undefined) {
  95.                 alert("你还未上传!");
  96.                 return;
  97.             }
  98.             //文件取消上传时候:状态为2,上传进度为0,已上传的位置为0
  99.             isload = 2;
  100.             setTimeout(function ({
  101.                 //Ajax提交
  102.                 $.ajax({
  103.                     url"Handler/FileUpload.ashx",
  104.                     type"POST",
  105.                     data: { deletes"all"filename: name, shardCount: shardCount },
  106.                     asynctrue,         //异步
  107.                     success: function (result{
  108.                         $("#output").text(result);
  109.                     }
  110.                 });
  111.                 //删除之后恢复初始状态
  112.                 loadi = 0;
  113.                 succeed = 0;
  114.             }, 1000)
  115.         })
  116.     },
  117.  
  118.     uploadfunction ({
  119.         console.log($("#types").val());
  120.         var file = $("#file")[0].files[0];  //文件对象
  121.         //判断文件的大小
  122.         if (file.size > parseInt($("#filemax").val()) * 1024 * 1024 * 1024) {
  123.             isload = 6return alert('您上传的文件超过最大限制!');
  124.         }
  125.         //console.log(file.type);
  126.         //选择文件的文件名
  127.         var filenamete = $("#file")[0].files[0].name;
  128.         //赋值当前文件名
  129.         filenameing = filenamete;
  130.         //截取文件后缀
  131.         var nametype = filenamete.substring(filenamete.lastIndexOf(".") + 1, filenamete.length);
  132.         if ($("#fjm").val() == '' || $("#fjm").val() == undefined) { isload = 6return alert('请输入文件名再上传!'); }
  133.         name = $("#fjm").val() + '.' + nametype;        //文件名
  134.         var size = file.size;        //总大小
  135.         var shardSize = 2 * 1024 * 1024;   //以2MB为一个分片
  136.         shardCount = Math.ceil(size / shardSize);   //总片数
  137.         var postsaves = function (i{
  138.             //计算每一片的起始与结束位置
  139.             var start = i * shardSize,
  140.                     end = Math.min(size, start + shardSize);
  141.  
  142.             //构造一个表单,FormData是HTML5新增的
  143.             var form = new FormData();
  144.             form.append("data", file.slice(start, end));  //slice方法用于切出文件的一部分
  145.             form.append("name", name);
  146.             form.append("total", shardCount);   //总片数
  147.             form.append("index", i + 1);        //当前是第几片
  148.             form.append("serverid", $("#server_order").val());
  149.             form.append("userid", $("#userid").val());
  150.             form.append("types", $("#types").val());
  151.             //判断该块是否存在
  152.             var bolr = isExistFile(name + "_" + (i + 1));
  153.             console.log(bolr + '----' + name + "_" + (i + 1) + "-----" + shardCount);
  154.             //判断是否已经上传过该片
  155.             if (bolr == true) {
  156.                 ++succeed;
  157.                 //传输未完成
  158.                 if (isload == 0 && i < shardCount - 1) {
  159.                     //js异步执行该方法
  160.                     requestAnimationFrame(function ({
  161.                         postsaves(i + 1);
  162.                     })
  163.                     $("#output").text('验证进度:' + ((succeed / shardCount) * 100).toFixed(0) + " % " + 100);
  164.                 }
  165.             } else {
  166.                 try {
  167.                     //Ajax提交
  168.                     $.ajax({
  169.                         url"Handler/FileUpload.ashx",
  170.                         type"POST",
  171.                         data: form,
  172.                         asynctrue,         //异步
  173.                         processData: false,  //很重要,告诉jquery不要对form进行处理
  174.                         contentType: false,  //很重要,指定为false才能形成正确的Content-Type
  175.                         success: function (result{
  176.                             if (result == '0' || result == '00') {
  177.                                 //上传成功时候
  178.                                 ++succeed;
  179.                             }
  180.                             if (isload == 0 && i < shardCount - 1) {
  181.                                 postsaves(i + 1);
  182.                             }
  183.                             if (isload == 0) {
  184.                                 $("#output").text('上传进度:' + ((succeed / shardCount) * 100).toFixed(0) + " % " + 100);
  185.                             }
  186.                             if (result == '00') {
  187.                                 alert('上传成功!');
  188.                                 loadtable();
  189.                             }
  190.                         }, errorfunction (result{
  191.                             if (confirm('网络连接中断!是否重新连接上传?如果不能重新连接!保证网络时点击继续!')) {
  192.                                 setTimeout(function ({ postsaves(0); }, 2000)
  193.                             } else {
  194.                                 isload = 1;
  195.                             }
  196.                         } //error  end 
  197.                     }); //ajax end
  198.                 } catch (e) {
  199.                 }
  200.             } //if else end
  201.             loadi = loadi + 1;
  202.         };
  203.         //执行上传方法入口
  204.         postsaves(loadi);
  205.     }
  206. };

3.一般处理程序接受分段过来的文件,存放文件的文件夹自建,还有插入数据库步骤方法省略:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.IO;
  6. using WebApplication1;
  7.  
  8. namespace LY.CIP.Component.VCS.Handler
  9. {
  10.     /// <summary>
  11.     /// FileUpload 的摘要说明
  12.     /// </summary>
  13.     public class FileUpload : IHttpHandler
  14.     {
  15.  
  16.         public void ProcessRequest(HttpContext context)
  17.         {
  18.             Rescue rescue = new Rescue();
  19.             context.Response.ContentType = "text/plain";
  20.             try
  21.             {
  22.                 if (context.Request.Form["isload"] != null && context.Request.Form["isload"].ToString() == "fly")
  23.                 {
  24.                     string filename = context.Request.Form["filename"].ToString();
  25.                     string dir = context.Server.MapPath("~/FileSave");
  26.                     if (File.Exists(dir + "/" + filename))
  27.                         context.Response.Write("1");
  28.  
  29.                 }
  30.                 else
  31.                     if (context.Request.Form["deletes"] != null && context.Request.Form["deletes"].ToString() == "all")
  32.                     {
  33.                         string filename = context.Request.Form["filename"].ToString();
  34.                         int shardCount = Convert.ToInt32(context.Request.Form["shardCount"].ToString());
  35.                         string dir = context.Server.MapPath("~/FileSave");
  36.                         string uurl = dir + "/" + filename;
  37.                         for (int i = 1; i < shardCount; i++)
  38.                         {
  39.                             try
  40.                             {
  41.                                 string uurlnew = uurl + "_" + i;
  42.                                 if (File.Exists(uurlnew))
  43.                                 {
  44.                                     System.IO.File.SetAttributes(uurlnew, System.IO.FileAttributes.Normal);
  45.                                     File.Delete(uurlnew);
  46.                                 }
  47.                             }
  48.                             catch (Exception)
  49.                             {
  50.                             }
  51.                         }
  52.                         context.Response.Write("取消成功!");
  53.                     }
  54.                     else
  55.                     {
  56.  
  57.                         //从Request中取参数,注意上传的文件在Requst.Files中
  58.                         string name = context.Request["name"];
  59.                         int total = Convert.ToInt32(context.Request["total"]);
  60.                         int index = Convert.ToInt32(context.Request["index"]);
  61.                         var data = context.Request.Files["data"];
  62.  
  63.                         //保存一个分片到磁盘上
  64.                         string dir = context.Server.MapPath("~/FileSave");
  65.                         string file = Path.Combine(dir, name + "_" + index);
  66.                         data.SaveAs(file);
  67.                         context.Response.Write("0");
  68.                         //如果已经是最后一个分片,组合
  69.                         if (index == total)
  70.                         {
  71.                            //获取必要参数
  72.                             string serverid = context.Request["serverid"];
  73.                             string userid = context.Request["userid"];
  74.                             string types = context.Request["types"];
  75.  
  76.                             file = Path.Combine(dir, name);
  77.                             var fs = new FileStream(file, FileMode.Create);
  78.                             for (int i = 1; i <= total; ++i)
  79.                             {
  80.                                 string part = Path.Combine(dir, name + "_" + i);
  81.                                 var bytes = System.IO.File.ReadAllBytes(part);
  82.                                 fs.Write(bytes, 0, bytes.Length);
  83.                                 bytes = null;
  84.                                 System.IO.File.Delete(part);
  85.                             }
  86.                             fs.Close();
  87.                             //截取文件类型
  88.                             string filetype = "";
  89.                             if (name.LastIndexOf(".") == name.Length - 4)
  90.                             {
  91.                                 filetype = name.Substring(name.LastIndexOf(".") + 13);
  92.                             }
  93.                             Dictionary<stringobject> dic = new Dictionary<stringobject>();
  94.                             dic.Add("filenmae", name);
  95.                             dic.Add("filetype", types);
  96.                             dic.Add("filepth""FileSave/" + name);
  97.                             dic.Add("server_id", serverid);
  98.                             dic.Add("user_id", userid);
  99.                             string reliut =rescue.InsertUploadFileSql(dic);
  100.                             if (reliut != "1")
  101.                             {
  102.                                 context.Response.Write("插入数据库失败!");
  103.                             }
  104.                             else {
  105.                                 //返回是否成功
  106.                                 context.Response.Write("0");
  107.                             }//if else  end
  108.                         }// if end 
  109.                     }// try  end
  110.             }
  111.             catch (Exception)
  112.             {
  113.  
  114.                 context.Response.Write("1");
  115.             }
  116.         }
  117.  
  118.         public bool IsReusable
  119.         {
  120.             get
  121.             {
  122.                 return false;
  123.             }
  124.         }
  125.     }
  126. }


4.datatables便利文件信息:


  1. $(function ({
  2.     page.init();
  3.     var datablesd = $("#datablesd");
  4.     var table = '<table id="example" class="display" width="100%" cellspacing="0"> </table>'
  5.     var logr = {
  6.         "sProcessing""处理中...",
  7.         "sLengthMenu""显示 _MENU_ 项搜索结果",
  8.         "sZeroRecords""没有匹配结果",
  9.         "sInfo""显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 条附件",
  10.         "sInfoEmpty""显示第 0 至 0 项结果,共 0 项",
  11.         "sInfoFiltered""(由 _MAX_ 项结果过滤)",
  12.         "sInfoPostFix""",
  13.         "sSearch""搜索:",
  14.         "sUrl""",
  15.         "sEmptyTable""暂无文件上传",
  16.         "sLoadingRecords""载入中...",
  17.         "sInfoThousands"",",
  18.         "oPaginate": {
  19.             "sFirst""首页",
  20.             "sPrevious""上页",
  21.             "sNext""下页",
  22.             "sLast""末页"
  23.         }
  24.     };
  25.     var conlius = [
  26.             { "title""查看""data""file_path""width""80px"'sClass'"text-center"renderfunction (data, type, row{
  27.                 if (row != null) {
  28.                     var file_path = row.FILE_PATH;
  29.                     return '<a href="' + file_path + '">查看</a>';
  30.                 }
  31.             }
  32.             },
  33.             { "title""删除""data""name""width""80px"'sClass'"text-center"renderfunction (data, type, row{
  34.                 if (row != null) {
  35.                     var UPLOAD_FILE_ID = row.UPLOAD_FILE_ID;
  36.                     return '<a href="#" class="mydelete" isid="' + UPLOAD_FILE_ID + '">删除</a>';
  37.                 }
  38.             }
  39.             },
  40.             { "title""文件类型""width""180px"'sClass'"text-right""data""LOOKUP_VALUE_NAME" },
  41.             { "title""文件名称"'sClass'"text-right""data""FILE_NAME" }
  42.         ];
  43.     var databless = function (data{
  44.         datablesd.html('');
  45.         datablesd.append(table);
  46.         $('#example', datablesd).DataTable({
  47.             data: data,
  48.             "serverSide"true,
  49.             searchingtrue,
  50.             lengthChangetrue,
  51.             pagingtrue,
  52.             scrollCollapsetrue,
  53.             serverSidefalse,
  54.             searchtrue,
  55.             processingtrue,
  56.             /* scrollY: 500,   表格的高度限制*/
  57.             scrollX: "100%",
  58.             scrollXInner"100%",
  59.             scrollCollapsetrue,
  60.             jQueryUIfalse,
  61.             autoWidthtrue,
  62.             autoSearchfalse,
  63.             pageLength10//每页条数
  64.             bLengthChange: false//不显示每页显示条数
  65.             searching: false//搜索
  66.             language: logr,
  67.             oAria: {
  68.                 "sSortAscending"": 以升序排列此列",
  69.                 "sSortDescending"": 以降序排列此列"
  70.             },
  71.             columns: conlius
  72.         });
  73.         $.each($(".mydelete", datablesd), function (i, e{
  74.             $(e).off("click")
  75.             $(e).on("click"function ({
  76.  
  77.                 var id = $(e).attr("isid")
  78.                 console.log(id + "--------");
  79.                 $.ajax({
  80.                     type"post",
  81.                     url"/FileUpload.aspx/delete",
  82.                     contentType"application/json;charset=utf-8",
  83.                     dataJSON.stringify({ id: id }),
  84.                     dataType"json",
  85.                     successfunction (d{
  86.                         //0;数据删除失败,1删除成功,2数据删除成功,文件删除失败
  87.                         console.log(d);
  88.                         if (d.d == "0") {
  89.                             alert('删除成功!');
  90.                         }
  91.                         loadtable();
  92.                     },
  93.                     errorfunction (result{
  94.                        // alert(result.responseText);
  95.                     }
  96.                 }); //ajax end
  97.  
  98.             }); //click  end
  99.  
  100.         }); //each  end
  101.     }
  102.     loadtable = function ({
  103.         //        console.log($("#userid").val());
  104.         //        console.log($("#server_order").val());
  105.         var user_id = $("#userid").val();
  106.         var server_id = $("#server_order").val();
  107.  
  108.         $.ajax({
  109.             type"post",
  110.             url"/FileUpload.aspx/SayHello",
  111.             contentType"application/json;charset=utf-8",
  112.             dataJSON.stringify({ user_id: user_id, oerder_id: server_id }),
  113.             dataType"json",
  114.             successfunction (ds{
  115.                 var _res;
  116.                 if (ds.d == "") {
  117.                     _res = [];
  118.                 } else {
  119.                     _res = JSON.parse(ds.d);
  120.                 }
  121.                 //console.log(_res);
  122.                 databless(_res);
  123.             },
  124.             errorfunction (result{
  125.                 //alert(result.responseText);
  126.             }
  127.         });
  128.     }
  129.  
  130.     loadtable();
  131. });


评价

css弹性盒子flex布局

css弹性盒子由于版本不同浏览器问题造成了一些不同的写法display:flexbox;在google浏览器中如果使用下面的写法就不行displa...

可输入下拉文本框据输入动态加载数据 jquery-editable-select

用到一个jquery-editable-select的控件github地址:https://github.com/indrimuska/jquery-editable-select这个插件的原理是...

.net mvc分部页.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

css中单位pxemrem和vh/vw的理解

&gt;px像素(Pixel)。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。em是相对长度单位。相对于当前对象内文本的字...

让IIS支持webp格式图片让IIS支持vtt格式iis设置mime类型iis配置支持的类型

webp格式图片可以让图片体积变小。也让下载图片变得更加困难一点 在线制作webp工具 https://www.upyun.com/webp?utm_mediu...

如何使用图标像使用文字一样使用文本图标的方法

1.首先在Iconfont-阿里巴巴矢量图标库上面找到你需要的图标然后加入你的购物车然后选择图标;注意:每个类型的图标会大小不...

使用七牛云的cdn服务提高图片的加载速度

CDN介绍CDN的全称是Content Delivery Network,即内容分发网络。CDN加速主要是加速静态资源,如网站上面上传的图片、媒体,...

通俗易懂什么是.NET?什么是.NET Framework?什么是.NET Core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

JS监听input、keydown有输入法时打字完成后触发事件

在给输入框绑定input或keydown事件时预期效果是有输入法时,输入中文后触发事件,不希望输一个字母就触发一次事件可以用到c...

修改了css后让浏览器从缓存中更新

当我们修改了css后,如果不做一些操作,浏览器是不会自动更新我们的样式文件的。除非是过期或者用户手动刷新清理缓存等。所...

C MVC RedirectToAction跳转时候传递参数Action之间传值

MVC Action之间传值,页面跳转传值方法一:路由传值很简单直接使用 RedirectToAction(string actionName, string controller...

当你工作遇到以下几种状态时请果断跳槽走人

已经有想跳槽的念头,但是一直磨磨蹭蹭、犹犹豫豫的混日子,这种念头或者一直持续,或者是不是冒出头来占据你的思维了。于...

C与Java二进制编码转换补码

在C#与Java接口对接时,需要将图片转化为二进制编码传输,这时候发现c#转换出来的编码的值是0~255的范围,而java方需要的是...

vs2017VS2019调试不单独打开浏览器解决自动退出调试

刚开始使用vs2017时,调试web程式,vs2017总是会单独打开一个浏览器来运行程式debug结束后,打开的浏览器就会自动关闭,有时...
不需要签名
排名
56
文章
8
粉丝
0
评论
1
Oracle中MERGE INTO,for,start with,decode用法
剑轩 : 多来一点点解释就更好了
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术