JavaScript FormData对象,FileReader对象,files属性
一.ajax与FormData的使用
最近在使用ajax朝后端提交数据时,如果提交的数据都是普通键值对还好说,直接使用ajax默认的格式向后端提交即可。
$('#d1').click(function () {
$.ajax({
// 提交的地址,不写默认提交至当前页面,同form表单的action
url:'/index/',
// 提交的方式
type:'post',
// 提交的数据,一般以键值对的形式出现
data:{'name':'jason','password':'123'},
// 回调函数
success:function (data) { // data接收的就是异步提交返回的结果
alert(data)
}
})
})
但是当有form表单中有提交文件的input框时<input type="file" id='my_file'>,就必须使用JS的files属性以及修改ajax的编码格式了。除此之外还要使用FormData对象,它不仅可以存普通键值对,还可以存文件。
$('#b1').on('click', function () {
let formdata = new FormData();//生成一个FormData对象
//$('#f1')[0]得到的是JQuery对象中的第一个JS对象,JS_obj.files拿到的包含所有文件对象的数组,通过索引取第一个文件对象
//可以将formdata想象成一个字典或者说是自定义对象,执行append('key', 'value')给字典添加键值对
formdata.append('file', $('#f1')[0].files[0]);
$.ajax({
url:'',
type:'post',
contentType:false,//用FormData自带的编码,所以不需要设置contentType
processData:false,//告诉浏览器不要处理数据
data: formdata,//直接将formdata提交至后端即可,后端request.POST拿到的是其中的普通键值对,而request.FILES拿到的就是其中的文件键值对
success:function (data) {
alert(data)
}
})
})
二. FileReader对象的使用
在写一个注册页面时,想要实现用户选择头像时,直接就能将选择的头像显示出来,就必须使用到JS的FileReader对象。
FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。
其中File对象可以是来自用户在一个元素上选择文件后返回的FileList对象(上面提到的使用files属性得到的文件对象),也可以来自拖放操作生成的 DataTransfer对象,还可以是来自在一个HTMLCanvasElement上执行mozGetAsFile()方法后返回结果。
2.1 可以用window对象的方法查看浏览器对FileReader的支持
if(window.FileReader) {
var fr = new FileReader();
// add your code here
}
else {
alert("Not supported by your browser!");
}
2.2 将上传头像显示出来的前端代码实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>register</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<!--用bootstrap渲染过的页面,这里为了方便只写了一个上传头像的input框-->
<div class="container">
<div class="row">
<div class="col-md-5 col-md-offset-3">
<h2 class="text-center">注册</h2>
<div>
<!--将img标签用label 标签包了起来,然后用display将Input框隐藏,这样点击图片就能选择上传头像-->
<label for="my_file">头像<img id='id_img' src="/static/img/111.jpg" alt="" style="width: 80px"> </label>
</div>
<input type="file" name='myfile' id="my_file" style="display: none">
</div>
</div>
</div>
<script>
/*给input框绑定change事件,内容改变就会触发,所以当选择头像然后上传时触发*/
$('#my_file').change(function () {
/*利用JS的files属性得到一个自定义对象(字典),键0对应的值就是文件对象,实际上就是我们上传的头像*/
let fileObj = this.files[0];
/*生成JS的FileReader对象*/
let fileReader = new FileReader();
/*将上传的头像交予fileReader对象,让其将内容读取然后渲染出来*/
fileReader.readAsDataURL(fileObj);
/*给fileReader对象绑定事件,等渲染完成后再执行function中的代码*/
fileReader.onload = function () {
/*将img标签中的src属性换成fileReader渲染过的内容,即换成我们上传的头像*/
$('#id_img').attr('src', fileReader.result)
}
})
</script>
</body>
</html>
files属性得到的自定义对象:

2.3 FileReader对象的方法

readAsText:该方法有两个参数,其中第二个参数是文本的编码方式,默认值为 UTF-8。这个方法非常容易理解,将文件以文本方式读取,读取的结果即是这个文本文件中的内容。
readAsBinaryString:该方法将文件读取为二进制字符串,通常我们将它传送到后端,后端可以通过这段字符串存储文件。
readAsDataURL:这是例子程序中用到的方法,该方法将文件读取为一段以 data: 开头的字符串,这段字符串的实质就是 Data URL,Data URL是一种将小文件直接嵌入文档的方案。这里的小文件通常是指图像与 html 等格式的文件。(其中base64的方式就是由此来获得的。。)
2.4 FileReader包含的事件
例子中使用了fileReader的.onload事件,当fileReader对象的方法执行完毕时就会执行onload后面指定的function,如果不使用onload,例子是不可能成功的,你会发现一上传头像,对应的Img原来的图片也会没有了。因为img要的是fileReader.result的结果,可是fileReader读取以及渲染文件需要时间,它又是异步的,所以img的到的结果是空,而不是我们上传的头像。

只要文件开始读取,无论结果如果,FileReader的对象中result属性都会有值,成功了就是读取的结果,失败了就是None。
是否疑惑之前img标签的src属性我们放的都是路径,可是fileReader.result拿出来的肯定不是路径啊,为什么当做src属性的值时可以显示出来?这是因为img标签的src属性不仅支持文件路径,还支持文件二进制数据或者url。
三. window.createObjectURL获取文件路径
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>register</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<!--用bootstrap渲染过的页面,这里为了方便只写了一个上传头像的input框-->
<div class="container">
<div class="row">
<div class="col-md-5 col-md-offset-3">
<h2 class="text-center">注册</h2>
<div>
<!--将img标签用label 标签包了起来,然后用display将Input框隐藏,这样点击图片就能选择上传头像-->
<label for="my_file">头像<img id='id_img' src="/static/img/111.jpg" alt="" style="width: 80px"> </label>
</div>
<input type="file" name='myfile' id="my_file" style="display: none">
</div>
</div>
</div>
<script>
$("#my_file").change(function(){
var objUrl = getObjectURL(this.files[0]) ;
console.log("objUrl = "+objUrl) ;
if (objUrl) {
$("#id_img").attr("src", objUrl) ;
}
}) ; //取得该文件的url
function getObjectURL(file) {
var url = null ;
if (window.createObjectURL!=undefined) {
url = window.createObjectURL(file) ;
} else if (window.URL!=undefined) {
url = window.URL.createObjectURL(file) ;
} else if (window.webkitURL!=undefined) {
url = window.webkitURL.createObjectURL(file) ;
}
return url ;
}
</script>
</body>
</html>
JavaScript FormData对象,FileReader对象,files属性的更多相关文章
- JavaScript 中的FileReader对象(实现上传图片预览)
方法一:使用js的FileReader对象 1.FileReader对象简介 1.检测浏览器对FileReader的支持 if(window.FileReader) { var fr = new Fi ...
- javascript:FileReader对象(读取文件)
FileReader对象 1.检测浏览器对FileReader的支持 1 if(window.FileReader) { 2 var fr = new FileReader(); 3 // add y ...
- 深入理解javascript对象系列第二篇——属性操作
× 目录 [1]查询 [2]设置 [3]删除[4]继承 前面的话 对于对象来说,属性操作是绕不开的话题.类似于“增删改查”的基本操作,属性操作分为属性查询.属性设置.属性删除,还包括属性继承.本文是对 ...
- 关于Javascript中通过实例对象修改原型对象属性值的问题
Javascript中的数据值有两大类:基本类型的数据值和引用类型的数据值. 基本类型的数据值有5种:null.undefined.number.boolean和string. 引用类型的数据值往大的 ...
- JavaScript常用对象的方法和属性
---恢复内容开始--- 本文将简单介绍JavaScript中一些常用对象的属性和方法,以及几个有用的系统函数. 一.串方法 JavaScript有强大的串处理功能,有了这些串方法,才能编写出丰富多彩 ...
- JavaScript中screen对象的两个属性
Screen 对象 Screen 对象包含有关客户端显示屏幕的信息. 这里说一下今天用到的两个属性:availHeigth,availWidth avaiHeigth返回显示屏幕的高度 (除 Wind ...
- JavaScript BOM-11-BOM的核心-window对象; window对象的控制,弹出窗口方法; 超时调用; 间歇调用; location对象常用属性; 位置操作--location.reaplace,location.reload(); BOM中的history对象; Screen对象及其常用属性; Navigator对象;
JavaScript BOM 学习目标 1.掌握什么是BOM 2.掌握BOM的核心-window对象 3.掌握window对象的控制.弹出窗口方法 什么是bom BOM(browser object ...
- JavaScript的事件对象中的特殊属性和方法(鼠标,键盘)
鼠标操作导致的事件对象中的特殊属性和方法 鼠标事件是 Web 上面最常用的一类事件,毕竟鼠标还是最主要的定位设备.那么通过事件对象可以获取到鼠标按钮信息和屏幕坐标获取等 鼠标按钮 只有在主鼠标按钮被单 ...
- JavaScript 秘密花园——对象的使用和属性操作
JavaScript 中所有变量都是对象,除了两个例外 null 和 undefined. false.toString(); // 'false' [1, 2, 3].toString(); // ...
随机推荐
- 网易与Google合作,于GDC开幕首日发布开源UI自动化测试方案
[TechWeb报道]美西时间3月19日,在GDC开幕第一天的Google开发者专场,Google发布了一款由网易研发的UI自动化测试方案:Airtest Project. Google方面评价,这可 ...
- WEB前端工程师简历
一个热爱前端的工程师 关于我 我的作品 ZENRON 关于我 求职意向 作品集 技术掌握 我的经历 联系我 关于我 英语/CET-4 坐标/苏州 状态/求职 我叫Zenron, 现居住苏州, 是一名前 ...
- Js对于数组去重提高效率一些心得
最近在找工作,好几次面试都问过数组去重的问题.虽然问的都不一样,但是核心思想是没有变的. 第一种是比较常规的方法 思路: 构建一个新的数组存放结果 for循环中每次从原数组中取出一个元素,用这个元素循 ...
- C++走向远洋——42(项目二,我的数组类,深复制,构造函数)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- iOS 使用系统的UITabBarController 修改展示的图片大小
1. 设置TabBarItem图片的大小 1 - (void)configurationAppTabBarAndNavigationBar { // 选中的item普通状态图片的大小 UIImage ...
- Web中间件常见漏洞总结
一.IIS中间组件: 1.PUT漏洞 2.短文件名猜解 3.远程代码执行 4.解析漏洞 二.Apache中间组件: 1.解析漏洞 2.目录遍历 三.Nginx中间组件: 1.文件解析 2.目录遍历 3 ...
- 绕过Referer和Host检查
1.我们在尝试抓取其他网站的数据接口时,某些接口需要经过请求头中的Host和Referer的检查,不是指定的host或referer将不予返回数据,且前端无法绕过这种检查 此时通过后端代理解决 在vu ...
- 使用web写UI, 使用js对接C++项目, 提高开发效率
ppt资源下载地址https://www.slidestalk.com/s/webui_nodejs_cmdlrx
- [译]HTML&CSS Lesson7: 设置背景和渐变色
背景对网站的设计有重大的影响.它有利于建立网站的整体感觉,设置分组,分配优先级,对网站的可用性也有相当大的影响. 在CSS中,元素的背景可以是一个纯色,一张图,一个渐变色或者它们的组合.在我们决定如何 ...
- docker部署tensorflow serving以及模型替换
Using TensorFlow Serving with Docker 1.Ubuntu16.04下安装docker ce 1-1:卸载旧版本的docker sudo apt-get remove ...