XMLHttpRequest file API

XMLHttpRequest file API

Table of Contents

  • FormData
  • file API
  • jquery file api
  • 上传文件
  • 从 FormData 中新建图片
  • 设置进度条
  • 大文件切割
  • 一些 XMLHttpRequest 2 的 API
  • 相关阅读

FormData

使用 FormData 不需要 setRequestHeader("content-type", "application/x-www-form-urlencoded");

<form id="tfrom">
  username: <input type="text" name="username"><br>
  age: <input type="text" name="age"><br>
  email: <input type="email" name="email"><br>
  <input type="button" value="ajax 发送" onclick="send();">
</form>
function send() {
    var fm = document.getElementById("tfrom");
    var fd = new FormData(fm);

    var xhr = new XMLHttpRequest();
    xhr.open("POST", "test.php", true);
    xhr.send(fd);      // 发送表单
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
            document.getElementById("debug").innerHTML = xhr.responseText;
        }
    }
}

// 也可以直接 new 一个, 然后 新建
function send() {
    var fd_test = FormData(fm);
    fd_test.append("username", "username_test");
    fd_test.append("email", "email_test");
    fd_test.append("age", "age_test");
    xhr.send(fd_test);
}

file API

<input type="file" name="file_name" onchange="select_file();">
<div id="debug"></div>
function select_file() {
    var file = document.getElementsByTagName("input")[0].files[0];
    var debug = document.getElementById("debug");
    var cont = "";
    cont += ‘文件名称: ‘ + file.name + "<br>";
    cont += ‘文件大小: ‘ + file.size + "<br>";
    debug.innerHTML = cont;
}

jquery file api

var fd = new FormData(document.getElementById("fileinfo"));
fd.append("CustomField", "This is some extra data");
$.ajax({
    url: "stash.php",
    type: "POST",
    data: fd,
    processData: false,  // 告诉 jQuery 不要去处理发送的数据
    contentType: false   // 告诉 jQuery 不要去设置 Content-Type 请求头
});

上传文件

<input type="file" name="file_name" onchange="select_file();">
<div id="debug"></div>
function select_file() {
    var myfile = document.getElementsByTagName("input")[0].files[0];
    var fd = new FormData();
    fd.append(‘myfile‘, myfile);

    var xhr = new XMLHttpRequest();
    xhr.open(‘post‘, ‘test.php‘, true);
    xhr.send(fd);
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
            document.getElementById("debug").innerHTML = xhr.responseText;
        }
    }
}

test.php

<?php
echo ‘<pre>‘;
print_r($_FILES);
echo ‘</pre>‘;

从 FormData 中新建图片

function select_file() {
    var myfile = document.getElementsByTagName("input")[0].files[0];
    var fd = new FormData();
    fd.append(‘myfile‘, myfile);

    var xhr = new XMLHttpRequest();
    xhr.open(‘post‘, ‘test.php‘, true);
    xhr.send(fd);
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
            document.getElementById("debug").innerHTML = xhr.responseText;
        }
    }

    // 显示图片
    var img = document.createElement(‘img‘);
    img.src = window.URL.createObjectURL(myfile);
    document.getElementsByTagName("body")[0].appendChild(img);
}

设置进度条

<input type="file" name="myfile" onchange="select_file();">
<div id="total" style="width: 500px; height: 50px; background: white; border: 1px solid green">
  <div id="loaded" style="width: 0%; height: 100%; background: green;"></div>
</div>
<div id="debug"></div>
function select_file() {
    var myfile = document.getElementsByTagName("input")[0].files[0];
    var fd = new FormData();
    fd.append(‘myfile‘, myfile);

    var xhr = new XMLHttpRequest();
    xhr.open(‘POST‘, ‘test.php‘, true);
    xhr.send(fd);

    xhr.upload.onprogress = function (event) {
        // console.log(event);
        if (event.lengthComputable) {
            // alert("loaded: " + event.loaded);
            // alert("total: " + event.total);    // fd.size

            var loaded = event.loaded;
            var total = event.total;
            var percent = 100 * loaded / total;
            document.getElementById("loaded").style.width = percent + "%";
        }
    }
    xhr.onload = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
            document.getElementById("debug").innerHTML = xhr.responseText;
        }
    }
}

大文件切割

function select_file() {
    const length = 10 * 1024 * 1024; // 10 M
    var start = 0;
    var end = start + length;
    var myfile = document.getElementsByTagName("input")[0].files[0];
    var total = myfile.size;

    var blob = new Blob();
    var fd = new FormData();

    while (start < total) {
        blob = myfile.slice(start, end);
        fd.append(‘file‘, blob);

        var percent = end/total * 100;
        document.getElementById("loaded").style.width = percent + ‘%‘;
        document.getElementById("loaded").innerHTML = percent + ‘%‘;

        var xhr = new XMLHttpRequest();
        xhr.open("post",  "test.php", false);  // 使用同步, 异步可能出现包顺序错误

        xhr.send(fd);

        start = end;
        end = start + length;
        if (end > total) {
            end = total;
        }
    }

}

test.php

<?php

$name = $_FILES[‘file‘][‘tmp_name‘];
$dest = ‘up/upload.txt‘;

if (!file_exists($dest)) {
    move_uploaded_file($name, $dest);
} else {
    file_put_contents($dest, file_get_contents($name), FILE_APPEND);
}

一些 XMLHttpRequest 2 的 API

var xhr = new XMLHttpRequest();
xhr.upload.addEventListener("progress", progress, false);
xhr.addEventListener("load", complete, false);
xhr.addEventListener("error", failed, false);
xhr.addEventListener("abort", canceled, false);
xhr.open("POST", "test.php");
xhr.send(fd);

function progress(event) { .... }
function complete(event) { .... }
function failed  (event) { .... }
function canceled(event) { .... }

XMLHttpRequest 2 还支持括跨域

相关阅读

时间: 2024-12-30 00:40:38

XMLHttpRequest file API的相关文章

php 下 html5 XHR2 + FormData + File API 上传文件

FormData的作用: FormData对象可以帮助我们自动的打包表单数据,通过XMLHttpRequest的send()方法来提交表单.当然FormData也可以动态的append数据.FormData的最大优点就是我们可以异步上传一个二进制文件. 例1如下: <!DOCTYPE HTML> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>

通过 File API 使用 JavaScript 读取文件

原文地址:http://www.html5rocks.com/zh/tutorials/file/dndfiles/ 简介 HTML5 终于为我们提供了一种通过 File API 规范与本地文件交互的标准方式.为了举例说明其功能,可使用 File API 在向服务器发送图片的过程中创建图片的缩略图预览,或者允许应用程序在用户离线时保存文件引用.另外,您可以使用客户端逻辑来验证上传内容的 mimetype 与其文件扩展名是否匹配,或者限制上传内容的大小. 该规范通过“本地”文件系统提供了多种文件访

使用File API 之FileReader 实现文件上传

对于基于浏览器的应用而言,访问本地文件都是一件头疼的事情,通常我们能做的仅仅是使用<input type="file">标签来上传文件.实现过程是:选取文件的时候value 属性保存了用户指定的文件的名称,表单被提交的时候,浏览器会向服务器发送选中的文件的内容而不仅仅是发送文件名.再获取服务器返回的地址,然后做预览. 但是如果有一天我们要上传一个图片,传了图片后预览想换另一张图片,就又得先上传到服务器再预览.在网络比较慢的情况下,这样真的很折腾. 所以我们某些时候需要先预览

File API简介

File API让我们可以创建文件,存储在本地文件系统的一个安全沙箱里,亦可以从其他来源读取文件,并对其进行操作 Web应用通过requestFileSystem方法来访问本地文件系统,该方法是全局的: requestFileSystem(type, size, successCallback, opt_errorCallback); 第一个参数表示存储的类型,有两个值可以选择,TEMPORARY或 PERSISTENT.使用TEMPORARY的话,存储的数据会由浏览器自行决定何时清除.PERS

HTML5 file API加canvas实现图片前端JS压缩并上传 (转载)

一.图片上传前端压缩的现实意义 对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验. 这种体验包括两方面: 由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅,同时大大降低了网络异常导致上传失败风险. 最最重要的体验改进点:省略了图片的再加工成本.很多网站的图片上传功能都会对图片的大小进行限制,尤其是头像上传,限制5M或者2M以内是非常常见的.然后现在的数码设备拍摄功能都非常出众,一张原始图片超过2M几乎是标配,此时如果用户想把手机或相机中的某个得意图片

file API+JCrop 选择、裁剪并上传头像

file API,直接读取本地文件,绕过了后台处理再返回前台的过程,使编程更简单.fileAPI和JCrop的结合使用上传头像. 1.html部分 <input id="demo" type="file" onchange="showPic();"/> <img id="avatar" src=""> 2.fileAPI预览图片(jquery) <script type=&qu

HTML 5 File API:文件拖放上传功能

即将到来的 html5 规范有几个特性,以致使 HTML 远远超出其本身作为一种标记语言的能力,并为 Web 开发者提供了一些强大的脚本工具.负责监督 HTML5 发展进程的 W3C 组织,刚刚出版了一份强有力的规格草案 – HTML5 File API 接口功能. 该 API 的设计初衷,是改善基于浏览器的 Web 应用程序处理文件上传的方式,使文件直接拖放上传成为可能.草案定义了新的输入选项 <input type=”file”> 来处理文件上传. 更为惊喜的是,该 API 为开发者提供了

js文件处理 File API

支持File API的浏览器有IE10+,Firefox3.5+,Opera10.6+,Safari5+,Chrome. 1.在表单元素上<input type="fiel" name="file" id="file" />,可以选择一个或多个文件,通过获取文件元素对象的集合files,来操作每一个对象files[i]: 用法:DOM操作 var files=document.getElementById("file&quo

phonegap file api

https://github.com/chrisben/imgcache.js/tree/master/examples 1.FILE API file api最大的两个功能是download和upload,download最常用的需求是把服务器的图片本地化到手机上,实现离线web app也可以浏览图片的功能.upload可以实现把本地图片上传到服务器的需求,如果项目涉及到发布图片,修改头像等需求,这个API就必须用到了 FileTransfer.download 经验: download服务器