资讯专栏INFORMATION COLUMN

input[type=file] 异步上传文件

silencezwm / 564人阅读

摘要:通过给标签绑定事件,获取上传的文件,异步上传。而通过的属性获取的上传文件被格式化为二进制形式。解决方案跨域异步提交工具使用非提交上传文件大小超过限制此外,还可以借助插件实现异步上传文件

背景

UI如图所示,其中有一个拍照图标,点击后要选择拍照或者从相册中选择要上传的图片。

拍照上传部分的代码如下

html部分

css部分

.take-phote-picture{
    margin: 10px 20px;
    width: 100px;
}

.select-picture{
    opacity: 0;
    position: absolute;
    width: 100px;
    height: 100px;
    top: 10px;
    left: 70px;
    border-radius: 50px;
}

设计思路

将一个input[type="file"]的透明度设置为0,悬浮在img标签之上。通过给input标签绑定change事件,获取上传的文件,异步上传。

问题

通过ajaxdata属性提交到后台的数据必须是键值对(key-value)的形式,其中值value不能为二进制数据。而通过inputfiles属性获取的上传文件被格式化为二进制形式。

解决方案
define([], function () {
    /**
     * 跨域异步post提交工具 使用Formdata,非iframe 提交
     */

    var ifajax = function(_url){
        var data = new FormData();
        var obj ={};

        obj.appendInput = function (input_obj) {
            if (input_obj.files) {
                for (var i = 0; i < input_obj.files.length; i++) {
                    data.append(input_obj.name, input_obj.files[i]);
                }
            } else {
                data.append(input_obj.name, input_obj.value);
            }
            return this;
        };

        obj.submit = function (success,err) {
            var xhr = new XMLHttpRequest();
            var url = _url||"/club/apiv1/me/b64-upload";

            xhr.open("POST", url, true);
            xhr.setRequestHeader("Accept", "*/*");
            xhr.onload = function () {
                if (xhr.status == 200) {
                    if (xhr.responseText) {
                        try {
                            //console.log(xhr);
                            var json = $.parseJSON($.trim(xhr.responseText));
                            success && success(json);
                        } catch (e) {
                            err && err("parse error", xhr.responseText);
                        }
                    }
                } else {
                    var message = xhr.responseText, code = xhr.status;
                    if (code === 413) {
                        message = "上传文件大小超过限制"
                    } else {
                        try {
                            var json = $.parseJSON(xhr.responseText);
                            message = json.message;
                            code = json.code;
                        } catch (e) {

                        }
                    }

                    err && err (code, message);
                }
            };
            xhr.send(data);
            return;
        }

        return obj;
    };

    return ifajax;
});

此外,还可以借助插件ajaxFileUpload实现异步上传文件

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82525.html

相关文章

  • 图片上传方案详解

    摘要:以往用到图片上传功能都是直接使用现成的插件,今天把其中用到的知识点整理一下。构造函数返回一个新构造的。事件及方法我们主要是用事件及方法,其他见处理事件。继续使用上文的读取图片读取完成是格式的图片我们将上的设为读取的结果即可实现预览功能。 以往用到图片上传功能都是直接使用现成的插件,今天把其中用到的知识点整理一下。 知识点字典 input 标签之 file 类型 FileReader ...

    glumes 评论0 收藏0
  • 图片上传方案详解

    摘要:以往用到图片上传功能都是直接使用现成的插件,今天把其中用到的知识点整理一下。构造函数返回一个新构造的。事件及方法我们主要是用事件及方法,其他见处理事件。继续使用上文的读取图片读取完成是格式的图片我们将上的设为读取的结果即可实现预览功能。 以往用到图片上传功能都是直接使用现成的插件,今天把其中用到的知识点整理一下。 知识点字典 input 标签之 file 类型 FileReader ...

    Karuru 评论0 收藏0
  • 前端图片上传解决方案

    摘要:图片上传是前端开发中经常使用到的,上传方案也有很多种吧,可能你有在使用一些插件完成上传,比如我以前自己写的一个后台系统现在在这里总结下图片上传的解决方案。构造函数返回一个新构造的。事件及方法我们主要是用事件及方法,其他见处理事件。 showImg(https://segmentfault.com/img/bVbmLXM?w=500&h=500); 图片上传是前端开发中经常使用到的,上传...

    Seay 评论0 收藏0
  • 前端图片上传解决方案

    摘要:图片上传是前端开发中经常使用到的,上传方案也有很多种吧,可能你有在使用一些插件完成上传,比如我以前自己写的一个后台系统现在在这里总结下图片上传的解决方案。构造函数返回一个新构造的。事件及方法我们主要是用事件及方法,其他见处理事件。 showImg(https://segmentfault.com/img/bVbmLXM?w=500&h=500); 图片上传是前端开发中经常使用到的,上传...

    Acceml 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<