原生js文件上传,input如何实现文件(图片)上传与预览

效果

上传与展示

说明

  • 首先文件上传得需要后台支持,我这里用的node写的后端服务,篇幅有限,这里就不贴后端代码了,有需要的留言联系

dom部分

  • 由于form表单自动关联input文件上传按钮,故点击上传文件按钮时会自动往 action 路径提交文件
    	<h3>文件上传:</h3>
        选择一个文件上传: <br />
        <form action="http://localhost:8090/upToImg1" method="post" enctype="multipart/form-data" id="formData2">
            名字 <input type="text" name="name"></input>
            <br />
            描述 <input type="text" name="content"></input>
            <br />
            <input type="file" name="image" size="50" onchange="fileChange(this)" />
            <br />
            <input type="submit" value="上传文件" id="submitButton" />
        </form>
        <button id="mybutton">获取</button>
        <ul id="myul"></ul>
    

js部分

  • 如果需要手动点击按钮上传,只需对其进行点击事件并禁止默认行为即可

  • 我这里用 jquery 做的请求,如果项目需要,请求时 需要携带其它参数 ,比如像我上面的名字和描述数据,可以把需要传递的数据用input框传递进去

  • 如果想对文件做限制,可根据onchange事件处理,函数返回false或promise的reject失败,即会阻止submit提交

    	var submitButton = document.getElementById('submitButton');
        var myul = document.getElementById('myul');
        var mybutton = document.getElementById('mybutton');
        submitButton.onclick = function (e) {
            if (e.preventDefault) e.preventDefault();
            else e.returnValue = false;
            var formData = new FormData($("#formData2")[0]);
            $.ajax({
                url: 'http://localhost:8090/upToImg1',
                type: 'POST',
                data: formData,
                async: false,
                cache: false,
                contentType: false,
                processData: false,
                success: function (returndata) {
                    console.log(returndata);
                },
                error: function (returndata) {
                    console.log(returndata);
                }
            });
        }
    
        function fileChange(target) {
            var fileSize = 0;
            fileSize = target.files[0].size;
            var size = fileSize / 1024;
            if (size > 1000) {
                alert("附件不能大于1M");
                target.value = "";
                return false;   //阻止submit提交
            }
            var name = target.value;
            var fileName = name.substring(name.lastIndexOf(".") + 1).toLowerCase();
            if (fileName != "jpg" && fileName != "jpeg" && fileName != "png" && fileName != "gif") {
                alert("请选择图片格式文件上传(jpg,png,gif,gif等)!");
                target.value = "";
                return false;   //阻止submit提交
            }
        }
        mybutton.onclick = function () {
            $.ajax({
                url: 'http://localhost:8090/upToImg1',
                type: 'get',
                success: function (returndata) {
                    console.log(returndata);
                    var str='';
                    returndata.data.forEach(ele => {
                        str+=`<li><img src="http://localhost:8090/upload/${ele.src}" alt="${ele.content}">${ele.name}</li>`
                    });
                    $("#myul").append(str)
                },
                error: function (returndata) {
                    console.log(returndata);
                }
            });
        }
    
  • 上传成功后对相应数据做需要操作即可,我这里上传成功后通过点击获取按钮得到上传文件的列表,并通过 字符串拼接 的方式动态添加图片到 ul

注意

由于图片是在服务端存储,返回的图片只是图片的文件名,要想通过 img 标签展示图片,需拼接正确路径以匹配到后端存储代码


文章作者: qiangqiang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 qiangqiang !
评论
 上一篇
npm时报错解决EPERM: operation not permitted, lstat npm时报错解决EPERM: operation not permitted, lstat
在使用vue-cli做项目时,曾遇到过npm run build打包时报错的问题,如下图 当时遇到问题后试了好多方法都不行,dist文件夹也删除不了,然后各种搜索,有的让清除缓存,有的说是无权限访问,要用管理员身份访问,可能这样能解决一
2019-06-21
下一篇 
node+express+mysql实现服务端文件上传功能 node+express+mysql实现服务端文件上传功能
前言 由于是新手,花费了不少时间,现在走通没有问题,所以要是大佬路过,请多多指导,本文主要对初入node不久的新手准备的,如有问题,欢迎留言互相学习 首先通过 express 起服务 //server.js con
2019-05-31
  目录