使用FormData实现ajax文件异步上传

1.传统的web开发文件上传一般是基于form表单的文件上传,同步的方式,用户体验差,可控性也差

2.异步上传的实现 有以下方式

2.1 借助浏览器插件 一般需要安装一些类似flash的插件  这种方式 缺点:需要安装插件  优点:可控性强,性能高

2.2 这种是伪异步上传,借助表单向隐藏的iframe提交,然后通过iframe通信操作当前页面 这种方式可控行查,体验一般,见下面代码

 2.3 借助html5 里的 FormData 对象,可实现进度控制,异步的上传方式,见代码

iframe方式的伪异步上传

up.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.js"></script>
</head>
<body>
<form method="post"  action="doup.php" enctype="multipart/form-data" target="up_file">
    姓名:<input name="user" type="text"><br>
    文件:<input type="file" name="ff"><br>
    <input type="submit" value="提交">
</form>
<iframe name="up_file" style="display: none"></iframe>
<div id="res"></div>
</body>
</html>

提交处理程序代码 doup.php

<?php
if($_FILES){
    $f=$_FILES[‘ff‘];
    $tmp_name=$f[‘tmp_name‘];
    if($f[‘error‘]===0){
        if(is_uploaded_file($tmp_name)){
            $file_arr=pathinfo($f[‘name‘]);
            //防止特殊文件名
            if(!is_dir(‘./upfile‘)) mkdir(‘./upfile‘,0755);
            $dst_file=‘./upfile/‘.time()."-".substr(md5($file_arr[‘filename‘]),0,5).".".$file_arr[‘extension‘];
            $o=move_uploaded_file($tmp_name,$dst_file);
            if($o){
                $html=<<<E
                 <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.js"></script>
                 <script>
                 var parent=window.parent.document;
                 var img="<img src=‘$dst_file‘ style=‘width:200px;height:200px;‘>";
                $(‘#res‘,parent).html(img);
                 </script>
E;
                echo $html;
            }else{
                echo 0;
            }
        }
    }
}

后端处理

借助FormData实现真的可控行异步上传

up1.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.js"></script>
</head>
<body>
    文件:<input type="file" name="myfile" id="myfile"><br>
    <p id="upbtn">
        <input type="button" value="异步上传" onclick="upload()">
        <span id="uptext" style="display: none">正在上传</span>
        <span id="tip"></span>
        <button id="stopbtn" style="display: none">停止上传</button>
    </p>
    <div id="res"></div>
<script>
    function upload(){
        var fd=new FormData();
        var f=$("#myfile")[0].files[0];
        if(typeof f !== "object") {
            alert(‘请先选择文件!‘);
            return false;
        }
        fd.append(‘myfile‘,f);
        var xhr=new XMLHttpRequest();

        xhr.upload.onprogress=function(e){
            if(e.lengthComputable){
                var percent=Math.round((e.loaded*100/e.total));
                console.log(‘%d‘,percent);
                $(‘#tip‘).text(percent);
            }
        }

        xhr.onloadstart=function(e){
            console.log("load start");
            $(‘#tip‘).text(‘开始上传‘);

            $(‘#stopbtn‘).one(‘click‘,function(){
                xhr.abort();
                $(this).hide();
            });
            loading(true);

        }

        xhr.onload=function(e){
            var res=xhr.responseText;
            var res_arr=JSON.parse(res);
            console.log(res_arr);
            if(res_arr.status==1){
                $(‘#tip‘).text(‘上传成功‘);
                $(‘#res‘).html(res_arr.dst);
            }else{
                $(‘#tip‘).text(res_arr.info);
            }

        }

        xhr.onerror=function(){
            console.log(‘error‘);
            $(‘#tip‘).text(‘发生错误‘);
        }

        xhr.onloadend=function (e){
            console.log("load end");
            loading(false);
        }
        xhr.open("POST","./doup1.php",true);
        xhr.send(fd);
    }

    function loading(showloading) {
        if (showloading) {
            $("#uptxt").show();
            $("#stopbtn").show();
        } else {
            $("#uptxt").hide();
            $("#stopbtn").hide();
        }
    }

</script>
</body>
</html>

后端处理doup1.php

<?php
$status=0;
$arr=array(‘status‘=>0,‘info‘=>‘没有文件上传或上传配置问题‘);
if($_FILES){

    $f=$_FILES[‘myfile‘];
    $tmp_name=$f[‘tmp_name‘];
    if($f[‘error‘]===0){
        if(is_uploaded_file($tmp_name)){
            $file_arr=pathinfo($f[‘name‘]);
            if(!is_dir(‘./upfile‘)) mkdir(‘./upfile‘,0755);
            $dst_file=‘./upfile/‘.time()."-".substr(md5($file_arr[‘filename‘]),0,5).".".$file_arr[‘extension‘];
            $o=move_uploaded_file($tmp_name,$dst_file);
            if($o){
                $arr=array(‘dst‘=>$dst_file,‘status‘=>1);
            }else{
                $arr=array(‘status‘=>0,‘info‘=>‘移动文件失败‘);
            }
        }
    }else{
        $arr=array(‘status‘=>0,‘info‘=>"up_err_code:".$f[‘error‘]);
    }
}
echo json_encode($arr);
时间: 2024-10-11 23:19:49

使用FormData实现ajax文件异步上传的相关文章

文件的上传(表单上传和ajax文件异步上传)

一.表单上传: html客户端部分: <form action="upload.ashx" method="post" enctype="multipart/form-data"> 选择文件:<input type="file" name="file1" /><br /> <input type="submit" value="上传&q

SpringMVC + AJAX 实现多文件异步上传

转自:https://www.jianshu.com/p/f3987f0f471f 今天,我就这个问题来写一篇如何用 SpringMVC + AJAX 实现的多文件异步上传功能.基本的代码还是沿用上篇文章中所用到的项目,需要的朋友可以点击前面的链接查看.在这里只贴出关键代码. 首先我们要准备一个 JS 文件,即:ajaxfileupload.js,它需要用到 jQuery,所以我们还需要准备 jQuery 的库,两个文件在文末尾都有链接提供下载. JSP 关键代码: <li> <div&

HTML5实现图片文件异步上传

利用HTML5的新特点做文件异步上传非常简单方便,本文主要展示JS部分,html结构.下面的代码并未使用第三发库,如果有参照,请注意一些未展现出来的代码片段.我这边的效果预览: 1.文件未选择 2.文件已选择 HTML代码部分: 思路:下面代码中我利用css的z-index属性将input="file"标签隐藏在了id=btnSelect元素下面,通过触发a标签的点击后,弹出文件选择框.下面的masklayer用于点击确认按钮后的弹出层,避免用户重复点击确认按钮. <div id

MVC 5.0(or5.0↓) Ajax.BeginForm 异步上传附件问题,答案是不能的!

MVC 5.0(or5.0↓)  Ajax.BeginForm 异步上传附件问题,答案是不能的! (请注意我这里说的异步!) 来看一下下面这段一步提交file的代码 //前台 .cshtml 文件 <script src="~/jquery.unobtrusive-ajax.js"></script>@using (Ajax.BeginForm("upLoadAsync", "UploadFile", new AjaxOp

jQuery+php实现ajax文件即时上传

很多项目中需要用到即时上传功能,比如,选择本地图片后,立即上传并显示图像.本文结合实例讲解如何使用jQuery和PHP实现Ajax即时上传文件的功能,用户只需选择本地图片确定后即实现上传,并显示上传进度条,上传完成后,显示图片信息. 查看演示DEMO下载源码 HTML 本示例基于jQuery以及相当出色的jquery.form插件,所以,先要载入jquery库和form插件.  <script type="text/javascript" src="jquery.min

百度 flash html5自切换 多文件异步上传控件webuploader基本用法

双核浏览器下在chrome内核中使用uploadify总有302问题,也不知道如何修复,之所以喜欢360浏览器是因为帮客户控制渲染内核: 若页面需默认用极速核,增加标签:<meta name="renderer" content="webkit"> 若页面需默认用ie兼容内核,增加标签:<meta name="renderer" content="ie-comp"> 若页面需默认用ie标准内核,增加标签

使用AjaxFileUpload.js实现文件异步上传

ajax是无法提交文件的,所以在上传图片并预览的时候,我们经常使用Ifame的方法实现看似异步的效果.但是这样总不是很方便的,AjaxFilleUpload.js对上面的方法进行了一个包装,使得我们不用去管理Iframe的一系列操作,也不用影响我们的页面结构,实现异步的文件提交. html: <input type="file" name="upload" hidden="hidden" id="file_upload"

关于MVC Ajax.BeginForm()异步上传文件的问题

问题描述: 如果用juqery原生的异步上传方式,只要如下方法即可 $.ajax({ type: "GET", url: "test.json", data: {username:$("#username").val(), content:$("#content").val()}, dataType: "json", success: function(data){ alert("");

Jquery FormData文件异步上传 快速指南

网站中文件的异步上传是个比较麻烦的问题,不过现在通过jquery 可以很容易的解决这个问题: 使用jquery2.1版本,较老版本不支持异步文件上传功能: 表单代码: [html] view plain copy print? <form id="fileUploadForm"> <input type="file" name="file" class="imageUpload"/> <span