书写是为了更好的记忆。

方案一: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,让我上传这个,而且接口那边还不改,就要文件。代码写的比较啰嗦,其实也用不了这么多东西,当时也是第一次接触atobBlobArrayBuffer这些东西,就写成这样了。

  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相关推荐

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

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

  2. jq实现前端文件上传

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

  3. jq上传本地文件到服务器,jq实现前端文件上传

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

  4. html5支持ajax和jQuery吗,使用HTML5文件上传与AJAX和jQuery(Using HTML5 file uploads with AJAX and jQuery)...

    使用HTML5文件上传与AJAX和jQuery(Using HTML5 file uploads with AJAX and jQuery) 诚然,Stack Overflow上有类似的问题,但似乎并 ...

  5. 【简报】超棒的拖放式文件上传javascript类库:FileDrop

    为什么80%的码农都做不了架构师?>>>    日期:2012-8-30  来源:GBin1.com 今天推荐一款来自俄国web开发人员的支持拖放的跨浏览器javascript文件上 ...

  6. ajax文件后台提交,有关文件上传 非ajax提交 得到后台数据问题

    下文给大家介绍文件上传非ajax提交得到后台数据的操作方法,具体详情如下所示: .......... 根据id获得表单数据然后发送ajax请求,获得后台返回数据,处理数据,完美. 但是如果需要上传文件 ...

  7. ajax 文件上传,ajax

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

  8. ajax文件上传data,ajax文件上传-FormData()

    HTML: JS: $("input[type='button']").on('click', upfile); /** * [upfile 文件上传] * @return {[O ...

  9. Struts2.0第三章(文件上传、ajax开发、json、Fastjson、Jackson、注解开发)

    Struts2.0文件上传: 浏览器端注意事项: 1.表单提交方式method = post: 2.表单中必须有一个<input type="file" name = &qu ...

  10. 前端文件上传,这8种场景

    在日常工作中,文件上传是一个很常见的功能.在项目开发过程中,我们通常都会使用一些成熟的上传组件来实现对应的功能.一般来说,成熟的上传组件不仅会提供漂亮 UI 或好的交互体验,而且还会提供多种不同的上传 ...

最新文章

  1. ldconfig动态链接库管理以及修改ld.so.conf.d
  2. c语言怎么写到单片机里,哪位师傅知道51单片机怎样编写子程序?C语言的。在主程序里调...
  3. SAP 外币金额 汇率 转换
  4. 面向对象--内部属性类型
  5. Vue 封装面包屑 (即粘即用)
  6. java 对第三方的异常_Java第三方API调用打开文件方法时抛出异常
  7. CentOS7 编译 Gradle
  8. 荣幸参加 微软 Teched 2012 会议
  9. 独占锁、共享锁、更新锁,乐观锁、悲观锁
  10. eclipse adt如何切换到设计界面_如何设计出优秀的UI界面?这4个方面帮你快速优化...
  11. Python 入门 Day5
  12. vs2010环境下提示找不到d3dx9.h,及其“dxerr.lib”。
  13. Wi-Fi当前的趋势及对IT和物联网的影响
  14. (私人收藏)古风PPT高级灰蓝传艺
  15. 资深分享——管理营销团队的方法和技巧
  16. 机器学习第二章之数据分析的基本武器
  17. 梁宁《产品思维30讲》 笔记第五弹——用户体验
  18. 西邮计算机组成原理期末考试,计算机组成原理小抄西邮版.doc
  19. D3D12渲染技术之根签名
  20. ios swift 聊天_iOS Swift上的加密聊天

热门文章

  1. WebsiteSpark是免费软件吗?
  2. discuz中,修改admin密码
  3. element ui 图片上传_游民晚播报:PS5手柄续航情况测试 UI界面概览放出
  4. 转载:socket通信基础
  5. OriginPro 2021安装教程(手把手式安装)
  6. Linux下的socket演示程序
  7. 用python定位手机_使用Python定位android和iphone
  8. vc 中C 语言命名规范(转)
  9. excelvba怎么设置不打开文件自动保存_自从有了这个工具,我的Office操作已经快到慢不下来了!(升级篇)...
  10. python3的3D开发-基于blender(1)