前端文件上传-javascript-ajax
书写是为了更好的记忆。
方案一:form表单上传
该方案优点是支持好,缺点刷新页面。
<form action="url" method="post" enctype="multipart/form-data">
<input type="file" name="file"><input type="submit" value="提交">
</form>
原理:enctype就是form上传文件的重点。
| 值 | 描述 |
|---|---|
application/x-www-form-urlencoded |
默认。在发送前对所有字符进行编码(将空格转换为 "+" 符号,特殊字符转换为 ASCII HEX 值) |
multipart/form-data |
不对字符编码。当使用有文件上传控件的表单时,该值是必需的 |
text/plain |
将空格转换为 "+" 符号,但不编码特殊字符 |
方案二:form表单上传-优化方案一缺点
该方案的优点也是支持好,缺点是不支持跨域。
<form action="url" method="post" enctype="multipart/form-data" target="iframe">
<input type="file" name="file"><input type="submit" value="提交">
</form>
原理:通过target把响应指向一个iframe页面,之后拿到返回数据。
| 值 | 描述 |
|---|---|
_blank |
在新窗口/选项卡中打开 |
_self |
默认, 在同一框架中打开 |
_parent |
在父框架中打开。 |
_top |
在整个窗口中打开 |
framename |
在指定的 iframe 中打开 |
方案三:ajax上传-优化方案二缺点
该方案的缺点兼容问题-caniuse,兼容有两个方向一是低版本ie不支持CORS跨域,一个就是input新加的Files。优点就是异步,进度条,判断大小,处理,跨域。
var file = input.files[0];
var xhr = new XMLHttpRequest();
if (xhr.upload) {
xhr.upload.addEventListener("progress", function(e) {
console.log(file, e.loaded, e.total);
}, false);
// 文件上传成功或是失败
xhr.onreadystatechange = function(e) {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
console.log('成功', xhr.responseText)
} else {
console.log('失败')
}
}
}
// 开始上传
xhr.open("POST", 'url', true);
xhr.send(file);
}
方案四:ajax-formData上传-多字段多文件;
该方案基本同上,只不过使用了FormData,缺点就是formData的兼容
var formData = new FormData();
formData.append('file', input.files[0]);
xhr.send(formData);
其他方案:
1. SWFupload Flash上传
2. jquery.form.js 其他插件上传
需求一:拖拽上传
使用drop事件,获取e.dataTransfer
document.querySelector('body').addEventListener("drop", (e)=>{
e.preventDefault();//不写的话,就打开了
console.log(e.dataTransfer.files[0])
});
需求二:截图-粘贴-上传
使用paste事件,获取e.clipboardData
document.querySelector('body').addEventListener("paste", (e)=>{
e.preventDefault();//不写的话,就打开了
console.log(e.clipboardData.files[0])
});
需求三:base64转换上传
场景发生在,一个和客户端交互的情况下,客户端选择的图片之后返给我了一个base64,让我上传这个,而且接口那边还不改,就要文件。代码写的比较啰嗦,其实也用不了这么多东西,当时也是第一次接触atob、Blob、ArrayBuffer这些东西,就写成这样了。
function(data){
var _str = atob(data.base64Str)
var _filePath = ((data.filePath.match(/.(jpg|jpeg|png|bmp)$/) || [])[1] || 'png').toLowerCase();
var _filePathHash = {
jpg:'image/jpeg',jpeg:'image/jpeg',png: 'image/png',bmp:'application/x-bmp',
}
var pre = '--------------------------1\r\nContent-Disposition: form-data; name="file"; filename="1.png"\r\nContent-Type: '+_filePathHash[_filePath]+'\r\n\r\n';
var end = '\r\n--------------------------1--';
var buffer = new ArrayBuffer(_str.length);
var uint8 = new Uint8Array(buffer);
for(var i in _str){
uint8[i] = _str.charCodeAt(i);
}
var blob = new Blob([pre, uint8, end], {type: _filePathHash[_filePath]});
var oReq = new XMLHttpRequest();
oReq.open("POST", "url", true);
oReq.setRequestHeader("Content-Type", "multipart/form-data; boundary=------------------------1")
oReq.onreadystatechange=function(){if (oReq.readyState==4 && oReq.status==200){console.log(oReq.responseText); }
oReq.send(blob);
需求四
上传一般来说都是要写样式的,不能说光是默认的input样式就ok,但是呢,样式又不是那么太好写,我们怎么办呢?
方案一
label标签的for去触发input的单击,这样不就好了吗?input的样式不好写,那我们把他藏起来,给label写样式。
方案二
input[type=file]左边是一个input右边是个按钮,其实是按钮的样式不好改,那么我们外面包裹一层overlfow:hidden,然后给input设置成一个极大,让他所有不一样的东西,都超出去,这样就是在能改动的区域改动了
前端文件上传-javascript-ajax的更多相关文章
- 七牛云存储的 Javascript Web 前端文件上传
因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,七牛云存储的 Web 前端文件上传 七牛是不错的云存储产品,特别是有免费的配额可 ...
- maven工程 java 实现文件上传 SSM ajax异步请求上传
java ssm框架实现文件上传 实现:单文件上传.多文件上传(单选和多选),并且用 ajax 异步刷新,在当前界面显示上传的文件 首先springmvc的配置文件要配置上传文件解析器: <!- ...
- Baidu WebUploader 前端文件上传组件的使用
简介 WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流I ...
- 利用struts2进行单个文件,批量文件上传,ajax异步上传以及下载
利用struts2进行单个文件,批量文件上传,ajax异步上传以及下载 1.页面显示代码 <%@ page language="java" import="java ...
- jq实现前端文件上传
FormData FormData是XMLHttpRequest Level 2 新增的一个接口. 使用FormData可以实现各种文件上传. 使用 // 创建FormData的实例 var form ...
- 【Web】前端文件上传,带进度条
最近做项目发现,在文件上传的过程中,增加进度条,能大大改善用户体验.本例介绍带进度条的文件上传 环境搭建 参考:[Java]JavaWeb文件上传和下载. 原生ajax上传带进度条 <%@ pa ...
- ajax 文件上传,ajax
ajax 文件上传,ajax 啥也不说了,直接上代码! <input type="file" id="file" name="myfile&qu ...
- django设置并获取cookie/session,文件上传,ajax接收文件,post/get请求及跨域请求等的方法
django设置并获取cookie/session,文件上传,ajax接收文件等的方法: views.py文件: from django.shortcuts import render,HttpRes ...
- 关于文件上传的ajax交互
首先我们来了解一下上传文件 <input type="file"> input的file常用上传类型 后缀名 MIME名称 *.3gpp audio/3gpp, vid ...
- Python Django缓存,信号,序列化,文件上传,Ajax登录和csrf_token验证
本节内容 models操作 Django的缓存 请求方式 序列化 Form 配合Ajax实现登录认证 上传文件 Ajax csrf_token验证方式 1 models操作 单表查询: curd(增 ...
随机推荐
- prometheus-数据展示之grafana部署和数据源配置
1.监控pods . prometheus再部署以后,会自带cAdvisor.结果如下: 2.K8S集群状态监控.需要使用kube-state-metrics插件.部署以后 kubernetes. ...
- vue项目环境搭建(webpack4从零搭建)--仅个人记录
一.nodejs环境搭建 首先需要下载node.js(推荐直接官网找最新的版本),下载完成后会自带npm包管理工具,打开cmd命令行界面,输入npm -v .node -v检查node.js与npm是 ...
- JZ-046-圆圈中最后剩下的数
圆圈中最后剩下的数 题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏. 其中,有个游戏是这样的:首先,让小朋友们围成一 ...
- python+selenium+pycharm使用
上一章节讲了安装python及selenium,该章节讲解下使用pycharm编辑器进行代码编写 下载地址:http://www.jetbrains.com/pycharm/download/#sec ...
- 关于stationary 和non-stationary signals 的区别和定义
结论:实际上在生活中是没有静态信号(stationary signals)的.而我们之所以把随机信号分为stationary and non-stationary 完全是根据信号产生的特征(chara ...
- 理解并手写 bind() 函数
有了对call().apply()的前提分析,相信bind()我们也可以手到擒来. 参考前两篇:'对call()函数的分析' 和 '对apply()函数的分析',我们可以先得到以下代码: Functi ...
- 自己动手写Vector【Cherno C++教程】
动手写一个Vector 本文是对<最好的C++教程>的动手写数据结构部分的一个整理,主要包含91p动手写Array数组和92p动手写Vector数组的内容. 自己动手来写这些数据结构是学习 ...
- CSAPP shell Lab 详细解答
Shell Lab的任务为实现一个带有作业控制的简单Shell,需要对异常控制流特别是信号有比较好的理解才能完成.需要详细阅读CS:APP第八章异常控制流并理解所有例程. Slides下载:https ...
- LGP3307题解
题意有点儿神秘,而且出题人可能有点大病( 项链由 \(n\) 颗珠子构成,相邻的珠子不能相同. 每颗珠子上有 \(3\) 个数字,这 \(3\) 个数之间没有顺序,且 \(\gcd\) 为 \(1\) ...
- 「科技」在线 O(1) 逆元
问题:固定模数 \(p\),多次回答某个数 \(a\) 的逆元.强制在线. 本文提供一个 \(O(p^{\frac{2}{3}})\) 预处理,\(O(1)\) 查询的做法. 首先定义一下 Farey ...