书写是为了更好的记忆。

方案一:form表单上传

该方案优点是支持好,缺点刷新页面。

  1. <form action="url" method="post" enctype="multipart/form-data">
  2. <input type="file" name="file"><input type="submit" value="提交">
  3. </form>

原理:enctype就是form上传文件的重点。

描述
application/x-www-form-urlencoded 默认。在发送前对所有字符进行编码(将空格转换为 "+" 符号,特殊字符转换为 ASCII HEX 值)
multipart/form-data 不对字符编码。当使用有文件上传控件的表单时,该值是必需的
text/plain 将空格转换为 "+" 符号,但不编码特殊字符

方案二:form表单上传-优化方案一缺点

该方案的优点也是支持好,缺点是不支持跨域。

  1. <form action="url" method="post" enctype="multipart/form-data" target="iframe">
  2. <input type="file" name="file"><input type="submit" value="提交">
  3. </form>

原理:通过target把响应指向一个iframe页面,之后拿到返回数据。

描述
_blank 在新窗口/选项卡中打开
_self 默认, 在同一框架中打开
_parent 在父框架中打开。
_top 在整个窗口中打开
framename 在指定的 iframe 中打开

方案三:ajax上传-优化方案二缺点

该方案的缺点兼容问题-caniuse,兼容有两个方向一是低版本ie不支持CORS跨域,一个就是input新加的Files。优点就是异步,进度条,判断大小,处理,跨域。

  1. var file = input.files[0];
  2. var xhr = new XMLHttpRequest();
  3. if (xhr.upload) {
  4. xhr.upload.addEventListener("progress", function(e) {
  5. console.log(file, e.loaded, e.total);
  6. }, false);
  7. // 文件上传成功或是失败
  8. xhr.onreadystatechange = function(e) {
  9. if (xhr.readyState == 4) {
  10. if (xhr.status == 200) {
  11. console.log('成功', xhr.responseText)
  12. } else {
  13. console.log('失败')
  14. }
  15. }
  16. }
  17. // 开始上传
  18. xhr.open("POST", 'url', true);
  19. xhr.send(file);
  20. }

方案四:ajax-formData上传-多字段多文件;

该方案基本同上,只不过使用了FormData,缺点就是formData的兼容

  1. var formData = new FormData();
  2. formData.append('file', input.files[0]);
  3. xhr.send(formData);

其他方案:

  1. 1. SWFupload Flash上传
  2. 2. jquery.form.js 其他插件上传

需求一:拖拽上传

使用drop事件,获取e.dataTransfer

  1. document.querySelector('body').addEventListener("drop", (e)=>{
  2. e.preventDefault();//不写的话,就打开了
  3. console.log(e.dataTransfer.files[0])
  4. });

需求二:截图-粘贴-上传

使用paste事件,获取e.clipboardData

  1. document.querySelector('body').addEventListener("paste", (e)=>{
  2. e.preventDefault();//不写的话,就打开了
  3. console.log(e.clipboardData.files[0])
  4. });

需求三:base64转换上传

场景发生在,一个和客户端交互的情况下,客户端选择的图片之后返给我了一个base64,让我上传这个,而且接口那边还不改,就要文件。代码写的比较啰嗦,其实也用不了这么多东西,当时也是第一次接触atobBlobArrayBuffer这些东西,就写成这样了。

  1. function(data){
  2. var _str = atob(data.base64Str)
  3. var _filePath = ((data.filePath.match(/.(jpg|jpeg|png|bmp)$/) || [])[1] || 'png').toLowerCase();
  4. var _filePathHash = {
  5. jpg:'image/jpeg',jpeg:'image/jpeg',png: 'image/png',bmp:'application/x-bmp',
  6. }
  7. var pre = '--------------------------1\r\nContent-Disposition: form-data; name="file"; filename="1.png"\r\nContent-Type: '+_filePathHash[_filePath]+'\r\n\r\n';
  8. var end = '\r\n--------------------------1--';
  9. var buffer = new ArrayBuffer(_str.length);
  10. var uint8 = new Uint8Array(buffer);
  11. for(var i in _str){
  12. uint8[i] = _str.charCodeAt(i);
  13. }
  14. var blob = new Blob([pre, uint8, end], {type: _filePathHash[_filePath]});
  15. var oReq = new XMLHttpRequest();
  16. oReq.open("POST", "url", true);
  17. oReq.setRequestHeader("Content-Type", "multipart/form-data; boundary=------------------------1")
  18. oReq.onreadystatechange=function(){if (oReq.readyState==4 && oReq.status==200){console.log(oReq.responseText); }
  19. oReq.send(blob);

需求四

上传一般来说都是要写样式的,不能说光是默认的input样式就ok,但是呢,样式又不是那么太好写,我们怎么办呢?

方案一

label标签的for去触发input的单击,这样不就好了吗?input的样式不好写,那我们把他藏起来,给label写样式。

方案二

input[type=file]左边是一个input右边是个按钮,其实是按钮的样式不好改,那么我们外面包裹一层overlfow:hidden,然后给input设置成一个极大,让他所有不一样的东西,都超出去,这样就是在能改动的区域改动了

前端文件上传-javascript-ajax的更多相关文章

  1. 七牛云存储的 Javascript Web 前端文件上传

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,七牛云存储的 Web 前端文件上传 七牛是不错的云存储产品,特别是有免费的配额可 ...

  2. maven工程 java 实现文件上传 SSM ajax异步请求上传

    java ssm框架实现文件上传 实现:单文件上传.多文件上传(单选和多选),并且用 ajax 异步刷新,在当前界面显示上传的文件 首先springmvc的配置文件要配置上传文件解析器: <!- ...

  3. Baidu WebUploader 前端文件上传组件的使用

    简介 WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流I ...

  4. 利用struts2进行单个文件,批量文件上传,ajax异步上传以及下载

    利用struts2进行单个文件,批量文件上传,ajax异步上传以及下载 1.页面显示代码 <%@ page language="java" import="java ...

  5. jq实现前端文件上传

    FormData FormData是XMLHttpRequest Level 2 新增的一个接口. 使用FormData可以实现各种文件上传. 使用 // 创建FormData的实例 var form ...

  6. 【Web】前端文件上传,带进度条

    最近做项目发现,在文件上传的过程中,增加进度条,能大大改善用户体验.本例介绍带进度条的文件上传 环境搭建 参考:[Java]JavaWeb文件上传和下载. 原生ajax上传带进度条 <%@ pa ...

  7. ajax 文件上传,ajax

    ajax 文件上传,ajax 啥也不说了,直接上代码! <input type="file" id="file" name="myfile&qu ...

  8. django设置并获取cookie/session,文件上传,ajax接收文件,post/get请求及跨域请求等的方法

    django设置并获取cookie/session,文件上传,ajax接收文件等的方法: views.py文件: from django.shortcuts import render,HttpRes ...

  9. 关于文件上传的ajax交互

    首先我们来了解一下上传文件 <input type="file"> input的file常用上传类型 后缀名 MIME名称 *.3gpp audio/3gpp, vid ...

  10. Python Django缓存,信号,序列化,文件上传,Ajax登录和csrf_token验证

    本节内容 models操作 Django的缓存 请求方式 序列化 Form 配合Ajax实现登录认证 上传文件 Ajax  csrf_token验证方式 1 models操作 单表查询: curd(增 ...

随机推荐

  1. Java序列化流的奇妙之旅

    Java序列化流有何奇妙之处呢?通过一个个案例逐一感受序列化流. !!!好戏在后头!!! 1.IO流读写文件 先从一个普通文件读写字符串开始讲起. 例子:输出字符串到文件,再从文件中读取字符串 在某一 ...

  2. 华为HCIA认证零基础入门-网络工程师必备之什么是静态路由?如何配置静态路由?

    一.静态路由功能介绍:静态路由就是手工配置的路由,使得数据包能够按照预定的路径传送到指定的目标网络. 当不能通过动态路由协议学到一些目标网络的路由时,配置静态路由就会显得十分重要. 二.静态路由应用场 ...

  3. CentOS 8 关闭 Firewalld 及 SELinux

    检查 SELinux 是否开启 执行 sestatus 指令可以检视目前 SELinux 的状态, 其中一项是是否有开启, 执行以下指令: # sestatus | grep status 如果看到 ...

  4. web自动化之selenium(六)利用坐标点定位

    这是通过第三发库实现对元素的定位,因为在无法定位元素的时候,只能通过外部来定位,此时就可以使用pyautogui模块,操作鼠标,模拟人进行操作 # 使用注意事项,不要过于的依赖它 1.使用时需要在通过 ...

  5. ArcMap操作随记(10)

    1.基于点生成辐射线 [缓冲区]→[构造视线] 2.求算点集中于剩余点距离总和最小的点 [构造视线]→[计算几何]→[汇总] 3.关于空间参考,关于投影 ①横轴墨卡托投影 "等角横轴切圆柱投 ...

  6. MySQL配置主从分离

    主服务器 192.168.176.110 从服务器 192.168.176.120 主数据库操作(ip:192.168.176.110)  配置MySQL主服务器的配置文件 [root@localho ...

  7. linux指令_张三

    1.基础指令语法 ls (路径) 含义:列出当前工作目录下的所有文件/文件夹的名称 pwd(printworkingdirectory,打印当前工作目录) cd (路径)       作用:用于切换当 ...

  8. 作为一名Python开发,我谈Linux和mac的使用体验

    我是一名Python开发,在2018.7~2021.6使用的是Linux系统 Deepin OS 作为自己的开发系统:在2022.7-至今使用的是 mac OS 系统作为开发系统. Deepin OS ...

  9. 合并两个以单链表形式表示的关于x的多项式(基于c语言)

    只写函数内部的,不懂得可以看前面一篇文章对链表的实现: pLinklist addBothLinklist(Linklist* first,Linklist* second){ Linklist *n ...

  10. Java——spring中session的获取

    获得session public static HttpServletRequest getSession(){ return ((ServletRequestAttributes) RequestC ...