上传图片几种方式解析(上)--file

2023-10-27

浏览器上传图片到服务器时通过input type="file" 以及onchange事件的配合实现的,element和vant的ui库的图片上传都是基于这个

input的files属性

1.众所周知,一级dom事件不同于addeventlisner这种,它的function中的this指向当前事件对象

具体来说 addEventListener与onclick这种的区别就是this

不过好像也不需要this来指出dom,因为e身上就有target和srcElement,这个就是当前触发的dom。。。。

 let b = document.getElementById('b')
    let a = document.getElementById('a')
    b.addEventListener('click', e => {
        console.log(e, this);//事件对象  window
    })
    a.onclick = function (e) {
        console.log(e, this);//事件对象, 当前dom
    }

回来正题,然后获取input元素后会发现,input元素身上比其他元素多一个files属性,这个是用来放选择上传的文件的,文件列表

可以通过打印console.dir(this)来看元素详情,

如果给input元素添加multiple属性,那么就可以多选上传文件,不过如果第一次选了两个文件,第二次又选了一个文件,每一次的选择都会覆盖前面的

所以这个多选指的是一次可以选择多个上传

方式1,file

file方式主要是通过FormData()格式化数据,不设置请求头,
 这样浏览器就会根据传入的data来判断contentType,formdata应该是二进制的
  所以可以看到传输的方式是binary二进制的

前端

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <input type="file" id="inputa" multiple>
  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
  <script>
    // file方式主要是通过FormData()格式化数据
    // multipart/form-data; boundary=
    let inputa = document.getElementById("inputa")
    inputa.onchange = function () {
      // this是input元素 this.files是选择的文件列表
      let fd = new FormData()
      console.log(this.files)
      // files文件列表无法通过普通数组等循环遍历,需要通过迭代器循环遍历
      for (let file of this.files) {
        console.log('object', file)
        fd.append(file.name, file)
      }
      // 循环把文件列表的文件添加到formdata中

      console.log(fd)

      $.ajax({
        url: "http://localhost/upload",//请求路径
        type: "POST",
        data: fd,
        dataType: 'JSON',
        // contentType: "application/x-www-form-urlencoded",
        contentType: false,//不设置请求头,
        // 这样浏览器就会根据传入的data来判断contentType,
        // 所以可以看到传输的方式是binary二进制的
        processData: false,//同上同理
        success(data) {
          if (200 == data.code) {
            console.log("上传成功!");
            console.log(data)
          } else {
            console.log("上传失败!");
            console.log(data)
          }
        },
        error() {
          console.log("与服务器通信发生错误");
        }
      })

    }
  </script>
</body>

</html>

 

后端

const multiparty = require("multiparty");

router.post('/upload', function (req, res) {
    // 1.根据传过来的base64,以及要改成的名字,动态存入图片
    console.log('req', req.body, req.request);
    let form = new multiparty.Form({ uploadDir: './public/img' })
    form.parse(req, function (err, filed, files) {
        console.log(filed, files)
        // let dataBuffer = new Buffer(filed, 'filed');
        // console.log(dataBuffer)
    })
    res.send({ img: 'imgsrc' })
})

这里有两个点

1.如果contentType如图不设置,那么后端就需要通过multiparty来接收和存储文件,因为后端的req.body中不会有值,空的

图示

可以看到req.body为空

2.而如果设置成application/x-www-form-urlencoded,那么后端的req.body中会有相应的二进制值

可以看到req.body为一堆乱码二进制

 

 

可以参考这几篇博客

https://www.cnblogs.com/zhensg123/p/11078579.html

http://www.mamicode.com/info-detail-2961489.html

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

上传图片几种方式解析(上)--file 的相关文章

  • buuctf[MRCTF2020]千层套路

    buuctf MRCTF2020 千层套路 题目描述 题目分析 解题过程 题目描述 题目给了一个以四位数字做文件名的压缩文件 题目分析 发现题目给的压缩文件名 就是解压这个压缩文件的密码 既然是千层套路 类似的操作可能要进行一千次 解题过程
  • div失去焦点事件onblur()无效

    初学js事件 想做一个点击时变红 取消聚焦时变白的div 于是我这样写代码 div style width 100px height 50px border 1px solid div
  • 谷歌Chrome浏览器开发者工具教程—基础功能篇

    Chrome F12开发者工具 是非常实用的开发辅助工具 对于前端开发者简直就是神器 但苦于开发者工具是英文界面 且没有中文 这让很多朋友都不知道怎么用 下载吧小编为大家带来Chrome开发者工具基础功能和高级性能分析器 Timeline
  • 背包问题的动态规划算法和fptas

    背包问题 instance 给定n个item i 1 2 n i 1 2 dots n weights w1 w2 wn Z w 1 w 2 dots w n in Z values v1 v2 vn Z v 1 v 2 dots v n
  • 搭建CentOS在线yum源镜像服务器

    说明 操作系统 CentOS 6 7 Nginx版本 1 8 0 rsync版本 3 0 6 IP地址和端口 192 168 3 100 8080 目标 同步CentOS镜像站点的内容到此服务器 通过配置http服务器 提供yum服务 一
  • Python——math库常用的数学函数

    在使用math库前 要用import导入该库 上图为math库中常用的一些数学函数 下面给出具体实例 例1 import math a eval input 请输入一个负数 print a math fabs a 输出结果 例2 impor
  • 【LeetCode刷题】237 删除链表中的节点

    题目 请编写一个函数 用于 删除单链表中某个特定节点 在设计函数时需要注意 你无法访问链表的头节点 head 只能直接访问 要被删除的节点 题目数据保证需要删除的节点 不是末尾节点 示例 这题其实真的简单 只能直接访问到给定要删除的节点 本
  • 设置Tab键为4个空格 Java开发手册规范之tab键设置

    设置Tab键为4个空格 在阿里的Java开发手册 一 编程规约 三 代码格式 第5条提到 强制 采用4个空格缩进 禁止使用tab字符 IDEA中勿勾选 Use tab character eclipse中必选 insert spaces f
  • [JAVEee]SpringBoot项目的创建

    SpringBoot可以更好的开发Spring项目 本文章将使用idea社区版来演示创建项目的过程与注意事项 SpringBoot的优点 SpringBoot中内置快速添加依赖的功能 能够便捷的集成各种框架 帮助开发 内置运行容器 无需配置
  • Linux top里面%CPU和us%的解释

    有的同学会把 CPU和us 搞晕 也就是下图所示在top的时候查看cpu的信息 这时有的同学会问 这两个CPU到底哪个是对的 其实都是对的 只是表达的意思不一样 官方解释如下 Cpu s 34 0 us 用户空间占用CPU百分比 CPU 上
  • 2023华为OD机试真题【最小调整顺序次数】

    问题描述 给定一个队列 但是这个队列比较特殊 可以从头部添加数据 也可以从尾部添加数据 但是只能从头部删除数据 输入一个数字n 会依次添加数字1 n 也就是添加n次 但是在添加数据的过程中 也会删除数据 要求删除必须按照1 n按照顺序进行删
  • 13 二叉树:建立存储结构(前序输入次序) &&二叉树专题

    目录 首先讲讲指针的引用 然后我们再复习一下typedef的用法 然后我们来创建二叉树 二叉树的建立 首先二叉树的存储结构 实际用代码体现 分为顺序存储和链式存储两种 但一般情况我们都用链式存储结构 部分内容转自指针的引用 MAGDB的博客
  • ChatGPT还有哪些不足?

    从技术角度来看 ChatGPT作为一个基于神经网络的自然语言处理模型 其优势在于能够处理大量的语言数据 并生成自然流畅的语言表达 ChatGPT还可以通过对话历史的分析 对当前对话进行上下文感知和情境推理 从而提供更加个性化和智能化的回答
  • Lua 输出可变参数列表内容

    在 Lua 中有8种基本数据类型 nil boolean number string user data function thread table 数据类型 描述 nil 表示一个无效值 boolean 包含两个值 false 和 tru
  • 第三章:关系数据库标准语言SQL

    模式数据定义语言 Schema Data Definition lanuage DDL 外模式数据定义语言 Subschema Data Definition lanuage 外模式DDL 数据存储有关的描述语言 Data storage
  • fedora常用命令

    fedora经验总结 新手必看 一 常用技巧 1 在linux中设置环境变量的方法 如果命令在环境变量已经设置的路径下 在终端命令行输入该命令的文件名和参数 如需要参数 回车即可 如果不在已设路径下 命令前需要加上完整的路径 每次都这样会很
  • Kotlin学习笔记

    1 方法中的参数 有var val 与没有的区别 fun A var name String fun A name String 有var val 表示是当前类的一个属性 无var val 表示是当前方法的一个参数 2 Kotlin中各种声
  • yolov5txt格式的labels转为coco的json格式

    最近在学习ppyoloe 标签文件的格式是coco的json格式 需要把yolov5的txt文件转为json 以下代码即可实现 import os import json import cv2 import random import ti
  • python创建学生类姓名学号_python定义一个学生类,包括学号、姓名和出生日期三个属性(数据成员);包括一个用...

    匿名用户 1级 2018 11 09 回答 import datetime class student def init self Sno Sname Sbarthday Sfaction self Sage 0 self Sgarde 优
  • 代码审计-Java项目&Filter过滤器&CNVD分析&XSS跨站&框架安全

    文章目录 Demo Filter 过滤器引用 Demo ST2框架 组件安全 CNVD Jeesns XSS跨站绕过 CNVD 悟空CRM Fastjson组件 Demo Filter 过滤器引用 Filter Javaweb三大组件之一

随机推荐

  • 【报错】jpa 双向映射导致栈溢出&Jackson的常用注解

    org springframework http converter HttpMessageNotWritableException Could not write JSON Infinite recursion StackOverflow
  • c++ 内存存储 解决char*p, char p[]的问题

    栈 通常用于编译期间就能确定存储大小的变量的存储区 用于在函数作用域内创建 在离开作用域后自动销毁的变量的存储区 有种说法是默认大小1M 堆 通常用于那些在编译期间不能确定存储大小的变量的存储区 它的存储空间是不连续的 一般由malloc
  • python学习—第一步—聪明方法学python

    目录 学习参考资料 遇到的一些小问题 python环境配置与基本语法 python安装与vscode绑定 python常量与变量 常量 变量 python运算符与函数 运算符 函数 局部变量与全局变量 控制流 python数据结构 序列Li
  • Tm4c123GX(tiva)入门详细教程

    TM4C123GX系列 学了几个月的Tiva 总的来说这个款单片机功能还是比较强大的 下面我将以TM4C123GH6PM为例介绍其基本资源及工程建立 点亮板卡上的LED灯以及对基本的时钟配置 PWM uart Timer等方面来做简要说明
  • 使用R语言操作数据框时,我们经常需要创建新的数据列来进行进一步的分析和处理。在本文中,我们将介绍如何通过加和两个数据列来创建一个新的数据列。

    使用R语言操作数据框时 我们经常需要创建新的数据列来进行进一步的分析和处理 在本文中 我们将介绍如何通过加和两个数据列来创建一个新的数据列 要创建新的数据列 我们可以使用mutate 函数以及数据框中的两个已有的数据列 假设我们有一个数据框
  • Vulkan SDK 中的 demo 编译配置 win10 vs2019

    一 下载安装 开始可以简装 然后在打开maintenancetool exe进一步安装其他部件 下载安装 Vulkan SDK Vulkan SDK What s in the SDK Where to Download 会在安装目录中找到
  • 减小内存的占用问题——享元模式和单例模式的对比分析

    前言 接口的常用用法都有什么 策略模式复习总结 的话题提起了 如何解决策略类膨胀的问题 说到 有时候可以通过把依赖于环境Context类的状态保存到客户端里面 而将策略类设计成可共享的 这样策略类实例可以被不同客户端使用 换言之 可以使用享
  • 【前端是什么】

    前端是什么 文章目录 前端是什么 1 前端的概念 2 前端的分类 3 前端的工作流程 4 互联网企业的典型组织结构图 1 前端的概念 1 1 前端的定义 对于网站来说 通常是指网站的前台部分 包括网站的表现层和结构层 通俗点就是用户可以看到
  • 关于STM32的IAP超详细图文解说

    IAP是In Application Programming的首字母缩写 IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写 目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级 以上是IA
  • 【Linux网络编程】传输层udp协议篇

    udp协议篇 一 本篇是在应用篇的后面的 二 传输层 2 1 再谈端口号 2 2 1 两个问题 2 2 2 两个常用命令 2 2 UDP协议 2 2 1 udp协议端格式 理解报头 2 2 2 udp的特点 2 2 3 udp的缓冲区 2
  • JAVASCRIPT this关键字详解

    this指向哪里 一般而言 this指向函数执行时的当前对象 In JavaScript as in most object oriented programming languages this is a special keyword
  • UTF-8转换成GB2312的全处理

    主题 将UTF 8编码的字符串转化成GB2312的编码 没有对应编码的字符串转化为 DEC 的格式 如 gt 54924 语言 PHP Javascript 内容 浏览器用Javascript中encodeURI函数将字符串 包含非GB23
  • 蓝桥杯C++组怒刷50道真题(填空题)

    深夜伤感网抑云 南辰Music 御小兮 单曲 网易云音乐 多年后再见你 乔洋 周林枫 单曲 网易云音乐 填空题25题完结 等23年题目出来了会补充 下一步就是编程题了 24年蓝桥杯之前 一定会给大家精心准备几个博客 目录 填空题 一 蓝桥杯
  • OSPF和RIP

    OSPF协议 劢态路由协议 通过在路由器上运行劢态路由协议 在路由器乊间交互路由信息 学习路由信 息最织生成路由转収表项 常见的劢态路由协议 RIP OSPF ISIS EIGRP BGP 劢态路由协议适用场合 路由器数量较夗 网段数量较夗
  • 找出一个无序数组的中位数

    要解决这个问题首先要了解什仫是中位数 所谓的中位数就是在一组有序的数字中找到中间的那个数字 如果数字的个数是奇数则直接返回中间的那个数 如果数字的个数是偶数此时这组数据的中位数有两个 取中间两个数的平均值即可 想法一 不论用什仫排序算法使得
  • flutter android 和 ios 发布

    android篇 keytool genkey v alias android keyalg RSA validity 20000 keystore Users 当前用户的用户名 android keystore keytool genke
  • Web学习之JavaScript

    文章目录 一 什么是JavaScript 二 JavaScript 用法 三 Chrome 浏览器中执行 JavaScript 四 JavaScript 语法 五 JavaScript 语句 六 JavaScript 函数 七 JavaSc
  • 【redis】单机安装部署redis7.0版本

    下面我以redis 7 0 5版本 来进行讲解 链接 https pan baidu com s 1FesU8iHJQyW4pVARIqeQAA 提取码 qtqc 单机安装Redis 1 首先需要安装Redis所需要的依赖 yum inst
  • 预测知识

    预测知识 预测技术流程及模型评价 目录 预测知识 预测技术流程及模型评价 神经网络 机器学习 深度学习 参考资料 神经网络 神经网络 neural network 是机器学习的一个重要分支 也是深度学习的核心算法 神经网络的名字和结构 源自
  • 上传图片几种方式解析(上)--file

    浏览器上传图片到服务器时通过input type file 以及onchange事件的配合实现的 element和vant的ui库的图片上传都是基于这个 input的files属性 1 众所周知 一级dom事件不同于addeventlisn