热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

前端进行文件上传的各种方法总结(代码)

这篇文章给大家介绍的文章内容是关于前端进行文件上传的各种方法总结(代码),有很好的参考价值,希望可以帮助到有需要的朋友。
这篇文章给大家介绍的文章内容是关于前端进行文件上传的各种方法总结(代码),有很好的参考价值,希望可以帮助到有需要的朋友。

一、通过Form表单提交上传

HTML enctype属性必不可少

    
         
         
    

上面一种方法通过表单自有属性进行提交,看似简单,但是也有其最大的缺点,那就是提交完毕之后直接进行了跳转,这对于当前的绝大多数的需求来说是不能满足的。那么我接下来介绍另一种直接利用xaj的post方法和FormData进行文件的上传。

二、通过jQuery post请求上传

HTML 多文件上传

JS

    (function(){
        $('#upload').change(function(e){
            let files = e.target.files;
            let params = new FormData();
            for(let i = 0; i 

这种方法解决了上传文件之后页面跳转的问题,但是如果你传的图片很大的时候怎么办?接下来就是我们要说的上传较大文件时一个优化方案。如今,为了提升用户的体验,不仅让用户再浏览时给用户极致的体验,还要在上传时感受不到卡顿的现象,这对于后端来说就做不了了,只能交给前端。下面我们介绍一下这种优化方案。

三、本地预览,Canvas图片压缩,转blob二进制文件

HTML 多文件上传

JS

    (function(){
        $('#upload').change(function(e){
            let files = e.target.files;
            let params = new FormData();
            for(let i = 0; i  {
                        //数组放入获取的base64本地图片地址
                        previewsArr.push(fileReader.result);
                    }
                }
                
                return previewsArr;
            
          }
         //图片压缩   
         function compressImage(base64URL){
                let img = new Image();
                let canvas = document.createElement('canvas');
                let cOntext= canvas.getContext('2d');
                img.src = base64URL;
                
                img.Onload= () => {
                    // 图片原始尺寸
                    var originWidth = img.width;
                    var originHeight = img.height;
                    // 最大尺寸限制
                    let maxWidth = 400,
                      maxHeight = 400;
                    // 目标尺寸
                    let targetWidth = originWidth,
                      targetHeight = originHeight;
                    // 图片尺寸超过400x400的限制
                    if (originWidth > maxWidth || originHeight > maxHeight) {
                      if (originWidth/originHeight > maxWidth/maxHeight) {
                        //更宽,按照宽度限定尺寸
                        targetWidth = maxWidth;
                        targetHeight = Math.round(maxWidth * (originHeight / originWidth));
                      }else{
                        targetHeight = maxHeight;
                        targetWidth = Math.round(maxHeight * (originWidth / originHeight));
                      }
                    }
                    
            
                    // canvas对图片进行缩放
                    canvas.width = targetWidth;
                    canvas.height = targetHeight;
                    // 清除画布
                    context.clearRect(0, 0, targetWidth, targetHeight);
                    // 图片压缩
                    context.drawImage(img, 0, 0, targetWidth, targetHeight);
            
            
                    //canvas直接转blob二进制文件,但是大部分浏览器不支持
                    // canvas.toBlob(function (blob) {
                    //   console.log(blob)
                    //   resolve(blob)
                    // }, 'image/png');
            
                    let base64Data = canvas.toDataURL("image/png", 0.92);
                    
                    let blob = dataURItoBlob(base64Data);
                    //上传图片
                    
                    let params = new FormaData();
                    params.append('visit_file', blob, 'cavas.png');
                    
                    uploadImage(params);
                    
            }
        }
        
          /**
           * base64 转二进制文件
           * @param {*} base64Data 
           */
          function dataURItoBlob(base64Data) {
            var bytes = window.atob(base64Data.split(',')[1]); //去掉url的头,并转换为byte
        
            //处理异常,将ascii码小于0的转换为大于0
            var ab = new ArrayBuffer(bytes.length);
            var ia = new Uint8Array(ab);
            for (var i = 0; i 

这里通过FileReader获取本地base64文件,然后通过canvas对图片进行压缩,最终转为二进制的blob文件,传到服务器上。这里还可以做的更好,利用promise,对压缩功能进行返回,不必在压缩函内进行调用上传,降低耦合度。这里为了大家理解,我就没有分开。哈哈~~主要还是我嫌麻烦...

四、Vue+axios上传图片

这里的页面样式,图片压缩和预览都和上面一样,这里我主要配置一下axois的http,让post接口能够成功上传。

        /**
       * 
       * @param {路由} url 
       * @param {路由参数} params 
       * @param {文件数据} body 
       */
      upload(url, params = '', body = {}) {
        let path = config.host + url + params;
        // console.log(body);
        return axios({
          method: "POST",
          url: path,
          data: body,
          processData: false, //必不可少参数
          traditional: true, //比不可少参数
          contentType: false,//比不可少参数
          headers: {
            'token': localStorage['token'],
            'originno': config.originno,
            "Content-Type": false
          }
        }).then(
          res => res
        ).catch((error) => {
          console.log(error);
        })
      }

我也是最近在做项目时遇到需求,当时使用的就是vue+axois,怎么提交怎么报错,最后发现就是文件没有传过去,只要配置上那三个必不可少的参数,就可以上传成功。如果想让用户有更好的体验,可以对图片进行一下压缩和本地预览。


推荐阅读
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • 本文介绍了DataTables插件的官方网站以及其基本特点和使用方法,包括分页处理、数据过滤、数据排序、数据类型检测、列宽度自动适应、CSS定制样式、隐藏列等功能。同时还介绍了其易用性、可扩展性和灵活性,以及国际化和动态创建表格的功能。此外,还提供了参数初始化和延迟加载的示例代码。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 本文介绍了如何使用jQuery和AJAX来实现动态更新两个div的方法。通过调用PHP文件并返回JSON字符串,可以将不同的文本分别插入到两个div中,从而实现页面的动态更新。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 获取ul中第一个li元素的五种方法和多个ul中第一个li元素的四种方法
    本文介绍了获取ul中第一个li元素的五种方法和多个ul中第一个li元素的四种方法,包括使用jQuery的选择器和遍历方法。通过这些方法,可以方便地获取到所需的元素,并进行相应的操作。 ... [详细]
  • 如何压缩网站页面以减少页面加载时间
    本文介绍了影响网站打开时间的两个因素,即网页加载速度和网站页面大小。重点讲解了如何通过压缩网站页面来减少页面加载时间。具体包括图片压缩、Javascript压缩、CSS压缩和HTML压缩等方法,并推荐了相应的压缩工具。此外,还提到了一款Google Chrome插件——网页加载速度分析工具Speed Tracer。 ... [详细]
  • mui框架offcanvas侧滑超出部分隐藏无法滚动如何解决
    web前端|js教程off-canvas,部分,超出web前端-js教程mui框架中off-canvas侧滑的一个缺点就是无法出现滚动条,因为它主要用途是设置类似于qq界面的那种格 ... [详细]
author-avatar
手机用户2502910213
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有