上传文件的几种方式

一、拖拽上传文件

css代码:

        .box {
            width: 300px;
            height: 300px;
            border: 1px solid red;
        }

        #ddd {
            width: 20px;
            height: 20px;
            border: 1px solid #000;
        }

        .obj {
            width: 100px;
            height: 100px;
        }

html代码:

<div class="box" draggable="true"></div>

js代码:

        // 获取元素
        let div = document.querySelector(".box")
        // 给元素添加拖拽的三个事件
        div.addEventListener("dragstart", denter, false)
        div.addEventListener("dragover", dover, false)
        div.addEventListener("dragend", dp, false)

        function denter(e) {
            e.dataTransfer.setData('a',10) // setData可以存储数据
            
        }
        function dover(e) {
            e.preventDefault()
            
        }
        function dp(e) {
            e.stopPropagation()
            e.preventDefault()//这两句是为了阻止浏览器的默认行为
            console.log(e.dataTransfer.getData("a"))//getData可以取出setData存的数据

            var file = e.dataTransfer.files
            handFiles(file)

        }
        function handFiles(file) {
            for (var i = 0; i < file.length; i++) {
                var f = file[i]
                // image/ 定义正则表达式,上传文件为图片
                var imageType = /^image\//
                if (!imageType.test(f.type)) {
                    continue  //判断不是图片跳出本次循环
                }
                // 这里创建一个img标签,并用let定义以便解决全局作用域变量提升问题
                let img = document.createElement('img')
                // var img = document.createElement('img')//用var定义,在下面要用立即执行函数解决作用域问题
                img.classList.add("obj") //添加属性
                div.appendChild(img) //追加到div元素

                var reader = new FileReader() // 读取文件的对象
                // 通过reader开始读取内容,一旦读取成功,会在resulte属性里面获取base64的字符串
                // 读取文件的过程是一个异步的过程
                reader.readAsDataURL(f)

                reader.onload = function(e){
                    img.src = e.target.result
                }

                /* 前面用var定义的话这里要解决作用域问题
                    reader.onload = function (aimg) {
                    return function (e) {
                        aimg.src = e.target.result
                    }
                }(img) */
            }
        }

二、利用post请求实现上传文件

原理使用form表单上传,用formData这种数据格式上传

html代码:

    <!-- type="text" 键值对方式提交 -->
    <!-- type="file" 上传 formData这种数据格式上传-->
    <form action="">
        value1: <input type="text" id="value1" name="v1">
        <br>
        value2: <input type="text" id="value2" name="v2">
        <br>
        <button>提交</button>
    </form>

js代码:

这里用的几种方案皆是使用的jQuery的方法来实现的,同时是用node.js写的服务端,用的请求是post请求,使用了formidable模块,下面是几种不同的方案。

方案一:

前端代码:

            $("button").click(function(e){
                e.preventDefault()//阻止默认的提交事件
                $.ajax({
                    url:"http://127.0.0.1:3000/add",
                    type:"POST",
                    data:{
                        val1:$("#value1").val(),
                        val2:$("#value2").val(),
                    },
                    success:function(res){
                        console.log(res);
                    }
                })
            })

后台代码:

router.post("/add",function(req,res,next){
  // /add  接口
  // url:http://127.0.0.1:3000
  // 请求参数 val1  val2
  //  v1 v2 前端使用字段
    res.json({
      code:200,
      message:"ok",
      data:{
        v1:req.body.val1,
        v2:req.body.val2
      }
    })
})

方案二:

前端代码:

 $("button").click(function(e){
                e.preventDefault()
                //1 创建formData数据格式
                var formData = new FormData($("form")[0])// FormData 参数是一个dom的form对象
                //2 把传递给服务器的数据追加到formdata对象里面
                formData.append('val1',$("#value1").val()) 
                formData.append('val2',$("#value2").val()) 
                // 删除数据
                // formData.delete('val1')
                // formData数据上传针对input=file,在上传文件的时候采用formData数据格式,大部分的浏览器都支持formData数据类型
                // 使用serilayArray() 只能传递普通的参数
                $.ajax({
                    url:"http://127.0.0.1:3000/addFormData",
                    type:"POST",
                    data:formData,
                    cache:false,//不使用缓存
                    // 如果提交数据格式为formData类型,必须添加下面两句,否则报错
                    processData:false,// 不处理数据,不希望使用application/x-www-form-urlencoded
                    contentType:false,//不采用默认的数据类型进行提交。默认的提交数据格式是application/x-www-form-urlencoded
                    success:function(res){
                        console.log(res);
                    },
                    error:function(err){
                        console.log(err.state());
                    }

                })


            })

服务端代码:

router.post('/addFormData',function(req,res,next){
  console.log("11")
  // 获取form表单传递过来formData格式的数据
    var formData =  new formidable.IncomingForm()
    console.log(formData)
    // err:解析出错的错误原因
    // fields:form传递的文本数据
    // files form传递的文件数据
    formData.parse(req,function(err,fields,files){
      res.json({
        code:200,
        message:"ok",
        data:{
          v1:fields.val1,
          v2:fields.val2
        }
      })
    })

})

方案三:

前端代码:

 // 第三种方法
            // serialize() form表单里面具有name属性的标签进行序列化,序列化字符
            // console.log($("form").serialize());
            $("button").click(function (e) {
                e.preventDefault()
                $.ajax({
                    url:"http://127.0.0.1:3000/addserialize",
                    type:"POST",
                    data:$("form").serializeArray(),
                    success:function(res){
                        console.log(res);
                    }
                })

            })

服务端代码:

router.post("/addserialize",function(req,res,next){
    res.json({
      code:200,
      message:"ok",
      data:{
        v1:req.body.v1,
        v2:req.body.v2
      }
    })
})

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值