H5移动端图片压缩上传开发流程

yizhihongxing

当今,移动端开发越来越受到人们的关注,而图片上传在大多数场景下都不可或缺。传统的图片上传方式面临的问题主要是图片文件过大,导致上传速度变慢,浪费流量,甚至可能导致服务器崩溃等问题。而今天我们介绍的H5移动端图片压缩上传开发流程,可以有效解决这些问题。

1. 实现原理

H5的File API提供了上传文件的功能,经过一系列转化后,我们可以将图片转化为Base64的字符串,通过Ajax请求上传到服务器。

图片压缩则是通过Canvas对图片进行处理,将原图片进行缩放,达到压缩的效果。具体而言,压缩的步骤如下:

  1. 选择图片文件,将其读入并转化为Base64的字符串;
  2. 将Base64的字符串转化为Image对象;
  3. 创建Canvas画布,绘制压缩后的图片;
  4. 将Canvas画布上的图片转化为Base64的字符串。

2. 压缩上传实现步骤

2.1 选择文件

首先,我们需要在HTML中添加一个input标签,用于选择文件,代码如下:

<input type="file" accept="image/*" id="fileInput">

accept属性指定了文件类型,这里只接受图片文件。id属性用于JavaScript中进行操作。

2.2 读取文件并压缩

我们通过JS获取选择的文件并读取,代码如下:

let fileInput = document.getElementById('fileInput');
let file = fileInput.files[0];
let reader = new FileReader();
reader.onload = function(evt) {
    let base64 = evt.target.result;
    let image = new Image();
    image.onload = function() {
        let canvas = document.createElement('canvas');
        let maxWidth = 1280;
        let maxHeight = 1280;
        let width = image.width;
        let height = image.height;

        if (width > height) {
            if (width > maxWidth) {
                height *= maxWidth / width;
                width = maxWidth;
            }
        } else {
            if (height > maxHeight) {
                width *= maxHeight / height;
                height = maxHeight;
            }
        }

        canvas.width = width;
        canvas.height = height;
        let ctx = canvas.getContext('2d');
        ctx.drawImage(image, 0, 0, width, height);
        let base64Compressed = canvas.toDataURL('image/jpeg', 0.7);
        // 在这里进行上传操作
    };
    image.src = base64;
};
reader.readAsDataURL(file);

代码中,我们首先获取input标签,然后从中取出选择的文件,在 onload 事件中,通过 FileReader 读取图片文件,并将其转换为 Base64 编码的字符串。接着,我们创建一个 Image 对象,将转换后的 Base64 字符串赋值给该对象的 src 属性,以获取图片的宽高信息。然后,通过 Canvas 对图片进行缩放处理,并将处理后的图片重新转化为 Base64 编码的字符串。

2.3 压缩后文件上传

在以上代码中,我们已经将压缩后的图片转化为Base64编码的字符串,现在我们需要将其上传到服务器。这里我们通过Ajax向服务器发送文件数据,代码如下:

let xhr = new XMLHttpRequest();
xhr.open('POST', '/upload');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('file=' + encodeURIComponent(base64Compressed)));

这里通过XMLHttpRequest对象发起POST请求,设置请求头,将Base64编码的字符串通过send方法发送到服务器。

3. 示例说明

3.1 示例一:基本的图片上传实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>图片上传示例</title>
</head>
<body>
    <input type="file" accept="image/*" id="fileInput">
    <script>
        let fileInput = document.getElementById('fileInput');
        fileInput.addEventListener('change', function() {
            let file = fileInput.files[0];
            let reader = new FileReader();
            reader.onload = function(evt) {
                let base64 = evt.target.result;
                let xhr = new XMLHttpRequest();
                xhr.open('POST', '/upload');
                xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
                xhr.send('file=' + encodeURIComponent(base64));
            };
            reader.readAsDataURL(file);
        });
    </script>
</body>
</html>

代码中,我们添加了一个事件监听器,当用户选择文件后触发,读取文件并将其转化为Base64编码的字符串。然后通过XMLHttpRequest对象向服务器发送带有该字符串的POST请求。

3.2 示例二:直接压缩上传

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>图片上传示例</title>
</head>
<body>
    <input type="file" accept="image/*" id="fileInput">
    <script>
        let fileInput = document.getElementById('fileInput');
        fileInput.addEventListener('change', function() {
            let file = fileInput.files[0];
            let reader = new FileReader();
            reader.onload = function(evt) {
                let base64 = evt.target.result;
                let image = new Image();
                image.onload = function() {
                    let canvas = document.createElement('canvas');
                    let maxWidth = 1280;
                    let maxHeight = 1280;
                    let width = image.width;
                    let height = image.height;

                    if (width > height) {
                        if (width > maxWidth) {
                            height *= maxWidth / width;
                            width = maxWidth;
                        }
                    } else {
                        if (height > maxHeight) {
                            width *= maxHeight / height;
                            height = maxHeight;
                        }
                    }

                    canvas.width = width;
                    canvas.height = height;
                    let ctx = canvas.getContext('2d');
                    ctx.drawImage(image, 0, 0, width, height);
                    let base64Compressed = canvas.toDataURL('image/jpeg', 0.7);

                    let xhr = new XMLHttpRequest();
                    xhr.open('POST', '/upload');
                    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
                    xhr.send('file=' + encodeURIComponent(base64Compressed));
                };
                image.src = base64;
            };
            reader.readAsDataURL(file);
        });
    </script>
</body>
</html>

在这个示例中,我们不再将未压缩的图片上传到服务器,而是在读取文件的事件中,直接利用 Canvas 对图片进行压缩并转化为 Base64 编码的字符串,然后通过Ajax上传到服务器。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:H5移动端图片压缩上传开发流程 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JavaScript中的object转换函数toString()与valueOf()介绍

    介绍 JavaScript 中的 object 转换函数 toString() 与 valueOf(),可能需要先了解一下 object 和函数的基本概念。 什么是 object? 在 JavaScript 中,object 是最常用的数据类型之一,它可以被用来存储和组织数据以及代码。你可以将其想象成一个容器,容器内可以存储各种类型的数据,包括字符串、数字、…

    JavaScript 2023年6月10日
    00
  • javaScript 实现重复输出给定的字符串的常用方法小结

    让我详细讲解一下“javaScript 实现重复输出给定的字符串的常用方法小结”: 标题 1.使用字符串的repeat方法 repeat() 方法返回一个新字符串,表示将原字符串重复 n 次。 let str = ‘hello’; let newStr = str.repeat(3); console.log(newStr); //’hellohellohe…

    JavaScript 2023年5月28日
    00
  • 基于ThinkPHP实现批量删除

    下面是详细讲解“基于ThinkPHP实现批量删除”的完整攻略。 背景 在一些网站或系统中,我们经常需要批量删除某些数据,如果手动一个一个删除,效率很低,而且容易出错。因此,我们需要实现一个批量删除的功能,来提高效率和降低错误率。本文将会以ThinkPHP为例,来讲解如何实现这个功能。 思路 具体的思路如下: 首先需要在前端页面上搭建一个删除按钮,勾选要删除的…

    JavaScript 2023年6月11日
    00
  • JSON 教程 json入门学习笔记

    JSON 教程 json入门学习笔记 什么是JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript的语法,但与之相比,JSON更简洁、更易于理解,且可用于多种编程语言之间的数据传输。 JSON的语法规则 对象 在JSON 中,对象以“{}”表示,两个花括号之间是一组属性-值对,属性名…

    JavaScript 2023年5月27日
    00
  • JS 实现可停顿的垂直滚动实例代码

    下面详细讲解一下“JS 实现可停顿的垂直滚动实例代码”的完整攻略。 前置知识 在学习本文之前,需要有以下一些前置知识: JavaScript 基础知识,包括:变量、函数、循环、条件判断、事件等; HTML/CSS 基础知识,包括:DOM、CSS 样式、布局等; 浏览器相关知识,包括:事件循环、渲染机制等。 实现思路 首先来介绍一下实现思路: 首先需要获取页面…

    JavaScript 2023年6月11日
    00
  • 性能优化篇之Webpack构建代码质量压缩的建议

    “性能优化篇之Webpack构建代码质量压缩的建议”是对于Webpack构建打包JS的一个性能优化方案。本文将详细讲解如何进行Webpack构建代码质量压缩的过程。 1. 使用Webpack UglifyJsPlugin插件实现代码压缩 在Webpack打包JS之前,参考文档Webpack UglifyJS Plugin,我们可以安装并使用Webpack U…

    JavaScript 2023年5月28日
    00
  • JavaScript 实现日期时间转时间戳

    当我们需要对日期和时间进行处理时,时间戳是一种非常常用的方式。在 JavaScript 中,我们可以通过一些简单的方法实现日期时间转时间戳的功能。下面是详细的攻略介绍: 步骤一:获取日期时间 首先,我们需要获取要转换为时间戳的日期和时间。我们可以使用 JavaScript 的内置 Date 对象来获取当前日期和时间。比如我们可以使用如下代码获取当前时间: c…

    JavaScript 2023年5月27日
    00
  • vue-router两种模式区别及使用注意事项详解

    Vue-router两种模式区别及使用注意事项详解 前言 在学习Vue时,经常会使用Vue-router来实现前端路由。Vue-router有两种模式:history模式和hash模式。本篇文章将详细讲解这两种模式的区别,并给出使用注意事项。 区别 Hash模式 默认模式是hash模式,即地址栏的URL格式是以#/开头,比如: http://localhos…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部