• 0
  • 0

H5拖拽上传图片

2019-08-31 945 0 admin 所属分类:HTML


CSS样式

.fileBox{margin:20px;}
.fileInputP{display:inline-block;width:200px;height:30px;border-radius:5px;overflow:hidden;position:relative;}
.fileInputP i{display:inline-block;width:200px;height:30px;color:#fff;background:#7d8f33;text-align:center;line-height:30px;}
#fileInput{position:absolute;left:0;top:0;right:0;bottom:0;opacity:0;}
#fileSpan{display:inline-block;width:660px;height:150px;border:2px dashed #ccc;text-align:center;line-height:150px;}

HTML代码

<div class="form-group">
    <label for="exampleFormControlInput1">选择图片</label>
    <input id="file" name="image[]" type="file" class="form-control-file" id="exampleFormControlInput1" multiple>
</div>
<div class="form-group fileBox" id="container" @drop="drop" @dragenter="dragenter" @dragover="dragover"> <span id="fileSpan" class="vm">图片拖拽到上传区</span>
    <div class="mask"></div>
</div>

正常提交操作

var file_datas = $('#file').prop('files');
$.ajaxSetup({
    async: false
});
var file_data = file_datas[0];
var form_data = new FormData();
form_data.append('file', file_data);
$.ajax({
    url: 'upload_image_url',
    dataType: 'json', 
    cache: false,
    contentType: false,
    processData: false,
    data: form_data,
    type: 'post',
    success: function(response) {
        if (response.code == 0) {
              alert('图片上传成功');
        } else {
            alert('图片上传失败,请重试!');
        }
    }
})

拖拽上传

// 监听drop事件,防止浏览器中打开客户端图片
document.ondragover = function(e) {
    // 阻止ondragover的默认行为(触发ondragleave)
    e.preventDefault();
};
document.ondrop = function(e) {
    // 阻止ondrop的默认行为(触发在当前窗口打开客户端图片)
    e.preventDefault();
};
dragenter(el) {
    el.stopPropagation();
    el.preventDefault();
},
dragover(el) {
    el.stopPropagation();
    el.preventDefault();
},
drop(el) {
    var that = this;
    // el.stopPropagation();
    // el.preventDefault();
    var f0 = el.dataTransfer.files[0];
    // // 创建文件读取器
    var reader = new FileReader();
    // 读取指定文件中的内容,作为"数据URL"
    reader.readAsDataURL(f0);
    reader.onload = function() {
        console.log("客户端数据读取完成");
        // 读取的结果(格式为数据编码)
        // console.log(reader.result)
        let file = that.Base64toFile(reader.result, 'image.jpg');
        var form_data = new FormData();
        form_data.append("file", file);
        $.ajaxSetup({
            async: false
        });
        $.ajax({
            url: 'upload_image_url',
            dataType: 'json',
            cache: false,
            contentType: false,
            processData: false,
            data: form_data,
            type: 'post',
            success: function(response) {
                if (response.code == 0) {
                    alert('图片上传成功');
                } else {
                    alert('图片上传失败,请重试!');
                }
            }
        })
    }
},
//将base64转换为文件
Base64toFile: function(dataurl, filename) { 
    var arr = dataurl.split(','),
        mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]),
        n = bstr.length,
        u8arr = new Uint8Array(n);
    while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new File([u8arr], filename, {
        type: mime
    });
}

拖拽上传可以简化成如下  上面的操作用于先将file转换成base64 可以用于压缩上传或者在线显示图片

drop(el) {
    var that = this;
    var f0 = el.dataTransfer.files[0];
    var form_data = new FormData();
    form_data.append("file", f0);
    $.ajaxSetup({
        async: false
    });
    $.ajax({
        url: 'upload_image_url',
        dataType: 'json',
        cache: false,
        contentType: false,
        processData: false,
        data: form_data,
        type: 'post',
        success: function(response) {
            if (response.code == 0) {
                doPost(response.data.src);
            } else {
                alert('图片上传失败,请重试!');
            }
        }
    })
}


拖拽上传的核心

捕获拖拽事件 获取文件数据 将base64的资源转换成文件格式上传

采用VUE开发不能直接用原生的捕获事件 否则无法监听。下面演示如何将上传的图片转换成图片显示在网页

// 监听drop事件,防止浏览器中打开客户端图片
document.ondragover = function(e) {
    e.preventDefault();
};
document.ondrop = function(e) {
    e.preventDefault();
};
// 若图片释放此元素上方,则需要在其中显示此图片
container.ondragover = function(e) {
    e.preventDefault();
}
container.ondrop = function(e) {
    var f0 = e.dataTransfer.files[0];
    var reader = new FileReader();
    reader.readAsDataURL(f0);
    reader.onload = function() {
        console.log("客户端数据读取完成");
        // 读取的结果(格式为数据编码)
        console.log(reader.result)
        var img = new Image();
        img.src = reader.result;
        container.appendChild(img);
        // 用ajax将读出的图片结果提交给服务端
    }
}


返回顶部