表单中的单文件点击和拖拽上传

  在项目中碰到的提交表单时单文件的上传,整理总结:

  

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>文件上传</title>
    <style media="screen">
    .wrap{
      width: 450px;
      height: 450px;
      border: 1px solid black;
      margin: 100px auto;
      padding: 20px;
    }
    .file-name{

    }
    .progressNumber{
      width: 80%;
      height: 20px;
      background: #ccc;
      margin: auto;
      border-radius: 10px;
      text-align: center;
    }
    .file-wrap{
      position: relative;
      width: 80%;
      margin: 30px auto;
    }
    .file-div{
      position: absolute;
      left: 36%;
      z-index: 50;
    }
    .fileInputP{
      display: inline-block;
      width: 120px;
      height: 30px;
      border-radius: 5px;
      overflow: hidden;
      position: relative;
    }
    .fileInputP span{
      display: inline-block;
      width: 110px;
      height: 30px;
      color: #fff;
      background: #0e90d2;
      text-align: center;
      line-height: 30px;
      cursor: pointer;
      border-radius: 5px;

    }
    .fileInputP input{
      position: absolute;
      left: 0;
      top: 0;
      right: 0;
      bottom: 0;
      opacity: 0;
    }
    #fileSpan{
      display: inline-block;
      width: 100%;
      height: 150px;
      border: 2px dashed #ccc;
      text-align: center;
      line-height: 100px;
      position: relative;
    }
    .file{
      position: relative;
    }
    .updata{
      cursor: pointer;
      color: #142ae4;
      font-weight: bold;
      position: absolute;
      right: 30px;ß
    }
    </style>
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
  </head>
  <body>
  <div class="wrap">
    <div class="file">
      <p>
        <span>文件上传:</span>
        <span class="file-name"></span>
        <span class="updata">上传</span>
      </p>
      <p class="progressNumber" id="progressNumber"> 我是进度条 </p>
    </div>
    <div class="file-wrap">
      <div class="file-div">
        <p class="fileInputP">
            <span>选择文件</span>
            <input type="file" multiple id="fileInput" />
        </p>
      </div>

      <span id="fileSpan">
          <p class="span-p">或者将文件拖到此处</p>
      </span>
    </div>
  </div>
  </body>
  <script type="text/javascript">
    var fileobj; // 文件对象
    $("#fileInput").on("change",function(){
      // 当前所选文件
      fileList(this.files);
    });
    // 拖拽外部文件,进入目标元素触发 dragenter 用户开始拖动元素时触发
    $("#fileSpan").on("dragenter",function(){
      $(this).css("background","#ccc");
      $(".span-p").text('可以释放鼠标了');
    });
    //拖拽外部文件,进入目标,离开目标,防止连续触发
    //ondragover - 当某被拖动的对象在另一对象容器范围内拖动时触发此事件
    $("#fileSpan").on("dragover",function(){
      return false;
    });
    //拖拽外部文件,离开目标元素触发
    //ondragleave - 当被鼠标拖动的对象离开其容器范围内时触发此事件
    $("#fileSpan").on("dragleave",function(){
      $(this).css("background","none");
      $(".span-p").text("或者将文件拖到此处!");
    });
    //ondrop - 在一个拖动过程中,释放鼠标键时触发此事件
    $("#fileSpan").on("drop",function(e){
      //HTML5的File API提供了一个FileList的接口,它
      // 可以通过拖拽事件的e.dataTransfer.files来传递的文件信息,获取本地文件列表信息。
      var file = e.originalEvent.dataTransfer.files;
      fileList(file);
      $(this).css("background", "none");
        return false;
    });

    function fileList(obj){
      // 如果没有文件
      if(obj.length < 1){
        return false;
      }else if(obj.length > 1){
        $("#fileSpan").text("每次只能上传一个文件!");
      }else {
        $("#fileSpan").text("或者将文件拖到此处!");
      }
      fileObj = obj[0]; // 获取当前的文件对象
      var name = obj[0].name;

      $(".file-name").html(name);
    }

    // 点击文件上传的方法
    function uploadFileFun(){
      var fd = new FormData(); // 定义fromdata对象
      fd.append("file",fileObj); // 传给后台的参数 “file” 参数名 fileObj 文件对象
      /**
      可以通告append 方法在 FormData对象里面添加参数
      //fd.append("fileOid",fileOid);
      // 可以在添加参数,fileOid是后台返回的,判断当前上传的文件是第几次上传的,第一次 传空字符串
      XMLHTTPRequest 对象,有progress 事件,用来返回进度信息
      -- 下载的progress 事件属于XMLHTTPRequest 对象
      -- 上传的progress 事件属于 XMLHTTPRequest.upload 对象
      **/
      var xhr = new XMLHTTPRequest();
      xhr.upload.addEventListener("progress",uploadProgress,false); // 传输进度
      xhr.addEventListener("load",uploadComplete,false);// 传输成功
      xhr.addEventListener("error",uploadFailed,false); //传输中出现错误
      xhr.addEventListener("abort",uploadCanceled,false); //传输被用户取消
      // xhr.addEventListener("loadstart", " 我是函数名 ",false); // 传输开始
      // xhr.addEventListener("loadEnd", " 我是函数名 ",false); // 传输结束,但是不知道是否成功
      xhr.open("POST", "/file/upload_file"); // 给后台提交的路径
      xhr.send(fd);
    }
    // 传输进度的方法 进度条显示
    function uploadProgress(evt) {
        if (evt.lengthComputable) {
          //evt.total 需要传输的总字符,evt.loaded 是已经上传的字节
          // if evt.lengthComputable 不为真  evt.total 等于 0
            var percentComplete = Math.round(evt.loaded * 100 / evt.total);
            // 上传的进度状态
            $('#progressNumber').progressbar('setValue', percentComplete);
        }
        else {//大小无法计算
            document.getElementById('progressNumber').innerHTML = "大小无法计算";
        }
    }
    //传输成功的方法
    function uploadComplete(evt){
      //服务器返回的数据
      var message = JSON.parse(evt.target.responseText);
      if(message.code == "success"){ // 后台返回的code值
        alert("上传成功!");
      }else if(message.code == "fail"){
        alert("上传失败!");
      }
    }
    // 传输中出现错误
    function uploadFailed(evt){
      alert("删除出错!");
    }
    // 上传由用户或者浏览器取消链接
    function uploadComplete(evt){
      alert("上传由用户或者浏览器取消链接");
    }
  </script>
</html>
View Code

 

  效果图:

      

 

  

这个就是单个文件上传的方法,如果想要多文件上传,可以看看我的另一篇文章,希望大家多提意见!

转载于:https://www.cnblogs.com/Sabo-dudu/p/7245156.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值