FormData 和 Iframe上传文件的两种方式

熵桥珊瑚
• 阅读 7630

用AJAX上传文件,一般都是用FormData对象。

FormData对象,是可以使用一系列的健值对来模拟一个完整的表单,然后使用XMLHttpRequest发送这个“表单”。

FormData的使用

  1. 创建一个空的FormData对象,然后再用append方法逐个增加键值对

    var formdata = new FormData();
    formdata.append("name","xx");
    formdata.append("flie", filename);

  2. 取得form元素对象,将它作为参数传入FormData对象中。

    var formOjb = document.getElementById("form");
    var formdata = new FormData(formOjb );

  3. 利用form元素对象的getFormData方法生成它

    var formobj = document.getElementById("form");
    var formdata = formobj.fetFormData();

formdata是一个不透明的对象,现在暂时只有一个append可以操作,不能通过序列化手段得到其里面的内容。它的用法也只有一个,用于增强型的XMLHttpRequest对象的send方法中去。

var formEl = document.getElementById("form");
formData = formEl.getFormData();
formData.append("serialnumber", serialNumber++);
xhr.send(formData);

还特别介绍一种用jQuery使用formData对象上传文件的方法。

使用<form>表单初始化FormData对象方式上传文件

HTML代码

<form id="uploadForm" enctype="multipart/form-data">
    <input id="file" type="file" name="file"/>
    <button id="upload" type="button">upload</button>
</form>

javascript代码

$.ajax({
    url: '/upload',
    type: 'POST',
    cache: false,
    data: new FormData($('#uploadForm')[0]),
    processData: false,
    contentType: false
}).done(function(res) {
}).fail(function(res) {});

注意点:

  • processData设置为false。因为data值是formData对象,不需要对数据进行处理。

  • <form>标签添加enctype="multipart/form-data"属性。

  • cache设置为false, 上传文件不需要缓存。

  • contentType设置为false。因为是由<form>表单构造的FormData对象,且已经声明了属性enctype="multipart/form-data",所以这里设置为false.

上传后,服务器代码需要从查询参数名为file获取文件输入流对象,因为<input>中声明的是name="file".

使用FormData对象添加字段方式上传文件

HTML代码

<div id="uploadForm">
    <input id="file" type="file"/>
    <button id="upload" type="button">upload</button>
</div>

javascript代码

var formData = new FormData();
formData.append('file', $('#file')[0].files[0]);
$.ajax({
    url: '/upload',
    type: 'POST',
    cache: false,
    data: formData,
    processData: false,
    contentType: false
}).done(function(res) {
}).fail(function(res) {});

从$('#file')[0].files[0] 中可以看出一个<input type="file"> 标签可以上传多个文件,只要在这个标签中添加multiple或multiple="multiple"属性。

用Ifrmae上传文件

因为FormData不是所有浏览器都支持的,所以有时候需要用iframe来实现文件上传的功能。

HTML代码

<div id="uploadform">
    <form id="theuploadform" action="">
        <input id="userfile" name="userfile" size="50" type="file" />
        <input id="formsubmit" type="submit" value="Send File" />
    </form>
</div>
<div id="iframe" style="width: 0px; height: 0px; display: none;">
</div>

js代码

var iframe = $('<iframe name="postframe" id="postframe" class="hidden" src="about:none" />');
$('div#iframe').append(iframe);
$('#theuploadform').attr("action", "/upload.do")
$('#theuploadform').attr("method", "post")
$('#theuploadform').attr("enctype", "multipart/form-data")
$('#theuploadform').attr("encoding", "multipart/form-data")
$('#theuploadform').attr("target", "postframe")

//need to get contents of the iframe

$("#postframe").load(function () {
    iframeContents = $("iframe")[0].contentDocument.body.innerHTML;
    $("div#textarea").html(iframeContents);
});
$('#theuploadform').submit();
return false;



点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
tp3.2读取excel文件
使用PHPExcel时,首先要下载PHPExcel并放在ThinkPHP/Library/Vendor下1.创建html文件(文件上传按钮)<formaction"{:U('控制器名/方法名')}"method"post"enctype"multipart/formdata" 
Easter79 Easter79
3年前
springboot项目上传文件出现临时文件目录为空
<divid"cnblogs\_post\_body"class"blogpostbody"<p最近写文件上传到服务器读取的代码,前端使用FormData上传,服务端用MultipartFile接收,自己测试了下MultipartFile对象有什么东西,结果一般属性都能出来,测试getInputStrea()方法的时候出现了以下错误,简单一
Stella981 Stella981
3年前
C# 请求数据 使用post的方式提交raw格式的数据,数据为json格式,多层嵌套
原文地址:https://cnodejs.org/topic/539ff8a5c3ee0b5820938d60raw方式使用的是纯字符串的数据上传方式,所以在POST之前,可能需要手工的把一些JSON格式的数据转换成字符串的(加两单引号)Formdata的方式就是keyvalue的提交,数据其实是分割的Formdata是键值对,你只能通
Stella981 Stella981
3年前
PHP导入导出EXCELl,CSV
PHP导入导出Excel,CSVHTML<formaction"{:U('Admin/Unit/importcsv')}"method"post"name"myform"id"myform"enctype"multipart/formdata"<input
Stella981 Stella981
3年前
AjaxPro.dll,asp.net 前台js调用后台方法(无刷新)
1、什么是AjaxAjax是异步Javascript和XML(AsynchronousJavaScriptandXML)的英文缩写。"Ajax"这个名词的发明人是JesseJamesGarrett,而大力推广并且使Ajax技术炙手可热的是Google。Ajax的核心理念在于使用XMLHttpRequest对象发送异步请求。
Stella981 Stella981
3年前
Play 2.0 用户指南 - 文件上传 -- 针对Scala开发者
   处理文件上传   在form中指定multipart/formdata属性上传文件   上传文件的标准方式是指定form的一个特殊属性multipart/formdata,可以让你混合表单数据和表单文件附件。   开始编写HTML表单:@form(actionrou
Wesley13 Wesley13
3年前
PHP POST 接受长字符串时出现500错误
昨天在开发的时候遇到一个问题,formentype“multipart/formdata”表单提交时显示500错误。开始我以为是php代码问题,我检查了一遍代码,没有问题。之后设置断点,依旧报错500,这就说明断点代码就没有执行,表单提交动作根本没有触发后端的php代码。于是,我将注意力放在了php配置上,反复修改配置调试,而且重装了php依
Stella981 Stella981
3年前
Flowable 实现【选择下一步流程审核人】
原理:1.在流程表单数据正式提交审核前,将流程表单数据formData及流程执行实例ExecutionEntity传递给接口2.接口在流程定义取得当前节点信息并循环查找出线 SequenceFlow还需要注意遇到网关时应该怎样处理3.使用变量执行出线SequenceFlow条件(类似完成提交任务操作)4.找出第一个用户
Wesley13 Wesley13
3年前
PHP实现图片(文件)上传
这几天整理做过的php项目,感觉这个经常会用到,传上来共享一下咯首先,前端界面1、表单的首行需要加上enctype"multipart/formdata",需要上传的图片必须设置type"file"表示选择文件<formid"img_form"method"post"class"formhorizontal"r
Stella981 Stella981
3年前
Django
一:form表单标签的文件上传1:浏览器:html文件<h4form文件上传</h4<formaction"/file_put/"method"post"enctype"multipart/formdata"{%csrf_token
Stella981 Stella981
3年前
Jfinal文件上传
1\.给form添加enctype"multipart/formdata"属性,如下:<formid"form"action"/fileController/upload"method"post"enctype"multipart/formdata"<inputtype"file"name"f