首页 > 其他分享 >利用LRZ压缩与Base64编码实现高效文件上传

利用LRZ压缩与Base64编码实现高效文件上传

时间:2024-09-23 17:24:16浏览次数:11  
标签:编码 文件 Base64 context LRZ 上传 图片

在这里插入图片描述

引言

在当今互联网时代,文件上传已成为众多在线服务不可或缺的一部分,尤其是在社交媒体平台上的照片分享和云存储服务中的文档管理等场景,高效且安全的文件上传机制对于保障用户体验至关重要。
为此,本文将介绍一种结合了LRZ压缩工具与Base64编码技术的优化文件上传方案。通过使用LRZ压缩工具对文件进行预处理,可以有效减小文件大小,进而提高上传效率并减少带宽消耗;而采用Base64编码则能够确保数据在网络传输过程中的完整性和安全性,从而为用户提供更加流畅和安全的文件上传体验。此方案特别适用于需要上传个人资料或头像等图片文件的应用场景。

使用LRZ上传

LRZ是一种高效的文件压缩工具,它支持多种压缩算法,能够在保持高压缩比的同时快速完成文件的压缩与解压操作。LRZ特别适用于大量小文件的压缩场景,因为它的性能优越,可以显著减少文件体积,加快网络传输速度。

Base64编码

在某些特定情况下,如通过电子邮件或HTTP请求发送二进制数据时,直接传输可能会遇到兼容性问题。此时,将文件转换为Base64格式可以有效解决这一问题。Base64编码将二进制数据转换为ASCII字符串,使得数据可以在任何传输介质上安全传输。

什么是Base64编码

定义

Base64是一种基于64个可打印字符来表示二进制数据的编码方式。它主要用于在网络上传输二进制数据,因为许多网络传输协议都是文本协议。这些字符包括A-Z、a-z、0-9以及两个额外的符号(通常是“+”和“/”)。每3个字节的二进制数据会被编码为4个Base64字符,因此Base64编码后的数据量会增加约33%。例如,100KB的二进制数据经过Base64编码后会变成约133KB。

工作原理

  1. 分组:将原始二进制数据按每3个字节一组进行分组。
  2. 转换:每个3字节的二进制数据被转换为4个6位的数值。
  3. 映射:每个6位的数值被映射到Base64编码表中的相应字符。
  4. 填充:如果最后一组不足3个字节,则使用“=”字符进行填充。

优缺点

  • 安全性:Base64编码不是加密方法,只是将二进制数据转换为文本数据,容易被解码。
  • 局限性:由于增加了数据量,不适合传输大量数据。
  • 优点:兼容性强,适用于多种传输协议;便于调试和日志记录。
  • 缺点:数据量增加,传输效率降低;编码和解码过程需要额外计算资源。

目的和应用场景

  • 目的:确保二进制数据在网络传输过程中不会被破坏。
  • 应用场景:电子邮件附件、网页中的图片嵌入、API请求中的二进制数据传输等。

上传功能的逻辑和代码

在这里插入图片描述
在这里插入图片描述

整体设计思路

  1. 用户选择图片文件。
  2. 使用lrz库对图片进行压缩。
  3. 将压缩后的图片转换为Base64格式。
  4. 通过AJAX将Base64字符串发送到服务器。
  5. 服务器接收到Base64字符串,解码并保存图片。
  6. 返回图片的URL给前端。

示例代码

前端代码

<asp:Content ID="Content3" ContentPlaceHolderID="ScripttPlaceHolder2" runat="server">
    <!-- 引入LRZ压缩库 -->
    <script src="lib/lrz/dist/lrz.bundle.js" type="text/javascript"></script>
    <!-- 引入jQuery库 -->
    <script src="Scripts/jquery-3.7.0.min.js" type="text/javascript"></script>
    <script>
        // 当文件输入框发生变化时触发事件
        $$("#upload").on("change", function () {
            // 使用LRZ库对选中的文件进行压缩,设置压缩后的宽度和高度为300像素
            lrz(this.files[0], { width: 300, height: 300 }).then(function (rst) {
                // 异步上传压缩后的图片
                $.post("ashx/UploadAvatar.ashx", { len: rst.base64Len, baseString: encodeURI(rst.base64) },
                    function (res) {
                        // 如果上传成功
                        if (res.State == 1) {
                            // 将上传成功的图片路径存储到隐藏控件中,用于后续更新使用
                            $("#hfAvatar").val(res.Message);
                            // 创建一个新的Image对象
                            var image = new Image();
                            // 设置图片的源路径
                            image.src = res.Message;
                            // 设置图片的宽度和高度
                            image.width = 100;
                            image.height = 100;
                            // 将图片添加到父元素中
                            $("#uploadselect").parent().append(image);
                            // 移除原来的上传按钮
                            $("#uploadselect").remove();
                        } else {
                            // 如果上传失败,弹出提示
                            alert("上传失败");
                        }
                    }, "json");
            });
        });
    </script>
</asp:Content>
前端代码
  1. 引入LRZ压缩库和jQuery库

    • lrz.bundle.js:用于图片压缩。
    • jquery-3.7.0.min.js:用于DOM操作和AJAX请求。
  2. 文件输入框变化事件

    • 使用$$("#upload").on("change", function () { ... })监听文件输入框的变化。
    • 使用lrz(this.files[0], { width: 300, height: 300 })对选中的文件进行压缩,设置压缩后的宽度和高度为300像素。
  3. 异步上传

    • 使用$.post方法发送AJAX请求,将压缩后的Base64字符串和长度发送到服务器。
    • 如果上传成功,将返回的图片路径存储到隐藏控件中,并创建一个新的Image对象显示图片。
    • 如果上传失败,弹出提示。

后端代码

using HPIT.Model;
using Newtonsoft.Json;
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Web;

namespace HPITAixiu.ashx
{
    /// <summary>
    /// 处理头像上传的一般处理程序
    /// </summary>
    public class UploadAvatar : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            // 从请求中获取Base64字符串的长度
            int len = int.Parse(context.Request.Form["len"]);
            // 如果长度小于等于0,返回400错误状态码
            if (len <= 0)
            {
                context.Response.StatusCode = 400;
                context.Response.End();
                return;
            }
            // 从请求中获取Base64字符串的长度
            int base64Length = context.Request.Form["baseString"].Length;
            // 如果Base64字符串长度小于等于0,返回400错误状态码
            if (base64Length <= 0)
            {
                context.Response.StatusCode = 400;
                context.Response.End();
                return;
            }

            // 将前台传过来的Base64格式的文件进行解码,存储到字节数组中
            // 注意:这里使用了HttpUtility.UrlDecode来解码URL编码的Base64字符串
            byte[] bytes = new byte[HttpUtility.UrlDecode(context.Request.Form["baseString"]).Length];
            // 如果压缩没有问题,传输到服务器上的文件长度和压缩的文件长度应相等
            if (len == bytes.Length)
            {
                // 获取Base64字符串中实际的图像数据部分,去掉前缀(如"data:image/jpeg;base64,")
                var baseString = context.Request.Form["baseString"].Split(',')[1];
                // 将Base64编码的字符串转换成字节数据
                byte[] newType = Convert.FromBase64String(baseString);
                // 生成一个随机文件名,避免上传的名字相同被覆盖
                string randomString = Guid.NewGuid().ToString();
                // 设置上传路径
                string filePath = $"{context.Server.MapPath("~/avatar/")}{randomString}.jpg";
                // 定义一个用于返回图片上传成功的路径
                string imageUrl = $"/avatar/{randomString}.jpg";
                // 将文件在内存流中进行传输
                using (MemoryStream memoryStream = new MemoryStream(newType))
                {
                    // 从内存流中将图片读取出来
                    using (Image image = Image.FromStream(memoryStream))
                    {
                        // 将读取出来的图片存储到指定的路径下
                        image.Save(filePath, ImageFormat.Jpeg);
                    }
                }

                // 创建一个AjaxResult对象,用于返回上传结果
                AjaxResult ajaxResult = new AjaxResult
                {
                    State = 1, // 表示上传成功
                    Message = imageUrl // 上传成功的图片路径
                };
                // 将当前返回的Ajax结果进行JSON序列化并响应到前台
                context.Response.Write(JsonConvert.SerializeObject(ajaxResult));
            }
            else
            {
                // 如果文件长度不匹配,返回400错误状态码
                context.Response.StatusCode = 400;
                context.Response.End();
            }
        }
    }
}
后端代码
  1. 设置响应内容类型

    • context.Response.ContentType = "text/plain":设置响应的内容类型为纯文本。
  2. 获取Base64字符串的长度

    • int len = int.Parse(context.Request.Form["len"]):从请求中获取Base64字符串的长度。
    • 如果长度小于等于0,返回400错误状态码。
  3. 获取Base64字符串

    • string baseString = context.Request.Form["baseString"]:从请求中获取Base64字符串。
    • 如果Base64字符串为空,返回400错误状态码。
  4. 解码Base64字符串

    • byte[] bytes = Convert.FromBase64String(baseString.Split(',')[1]):解码Base64字符串,去掉前缀(如"data:image/jpeg;base64,")。
  5. 生成随机文件名

    • string randomString = Guid.NewGuid().ToString():生成一个随机文件名,避免文件名冲突。
    • string filePath = context.Server.MapPath($"~/avatar/{randomString}.jpg"):设置上传路径。
  6. 保存图片

    • 使用MemoryStream将文件在内存流中进行传输。
    • 使用Image.FromStream(memoryStream)从内存流中读取图片。
    • 使用image.Save(filePath, ImageFormat.Jpeg)将图片保存到指定路径。
  7. 返回上传结果

    • 创建一个AjaxResult对象,用于返回上传结果。
    • 使用JsonConvert.SerializeObject(ajaxResult)将结果进行JSON序列化并响应到前台。
  8. 是否可重用

    • public bool IsReusable { get { return false; } }:表示该处理程序是否可以重用。

总结

通过本文,我们详细介绍了如何使用LRZ压缩工具上传图片,并结合Base64编码进行处理。这种方式不仅提高了文件传输的效率,还确保了数据的完整性和兼容性。希望本文能对您有所帮助,鼓励您尝试并在实际项目中应用这些技术。

参考资料


希望这篇博客文章能够帮助您更好地理解和应用LRZ压缩和Base64编码技术。如果有任何问题或需要进一步的帮助,请随时联系我。

标签:编码,文件,Base64,context,LRZ,上传,图片
From: https://blog.csdn.net/2302_82029124/article/details/142425954

相关文章

  • Vant之手机端上传图片只允许拍照上传
    1.开发拍照上传页面-andImgCapture.vue<template><div><van-buttonicon="plus"type="primary":disabled="disabled"@click.stop="clickCamera">拍照上传</van-button><divclass="carma-co......
  • 文件上传日志包含详解与CTF实战
    1.日志简介1.1日志介绍日志是记录系统或应用程序运行时事件的文件。这些记录可以包括错误信息、用户活动、系统性能指标等,帮助开发者和管理员监控和排查问题。日志通常会记录多种内容,包括:时间戳:事件发生的具体时间。用户代理(UA)头:浏览器或客户端的类型和版本。IP地址:发起......
  • wordpress网站维护教程:不能上传文件,数据库报错的解决方法
    当WordPress网站遇到不能上传文件或数据库报错的问题时,这可能会影响网站的正常使用。下面分别针对这两种情况提供一些可能的解决方法。不能上传文件权限问题:检查上传文件的目标目录权限是否正确。通常,WordPress的上传目录(默认为/wp-content/uploads/)应该具有可写的权限。你......
  • 探索Base64奥秘:数据转换的神奇魔法师
    一、简介​Base64是一种基于64个可打印ASCII字符来表示二进制数据的编码方式,常用于需要通过文本数据传输、存储二进制数据的场景中。例如在前端开发中的使用场景有:在HTML和CSS中将图像文件转为Base64数据嵌入到文档中、在前后端JSON数据交互时,将文件转为Base64数据进行上......
  • Spring Boot+MinIO实战:掌握分片上传、秒传与断点续传,让文件管理更高效!
    在现代应用中,随着文件大小的不断增大和网络环境的复杂化,传统的文件上传方式已难以满足用户需求。通过将SpringBoot与MinIO集成,可以轻松实现文件的分片上传、秒传和续传功能,为用户提供更流畅的上传体验。分片上传分片上传是将大文件拆分成多个小块分别上传,避免单次上传大文件带......
  • C# base64转pdf + 上传至指定url
    base64topdf1usingSystem;2usingSystem.Collections.Generic;3usingSystem.IO;4usingSystem.Linq;5usingSystem.Text;6usingSystem.Threading.Tasks;78namespaceHS.Common.Helper9{10publicclassPdfHelper11{......
  • 为何生成静态页的时候或者上传附件过程中有报错:Maximum execution time of 30 seconds
    错误信息 Maximumexecutiontimeof30secondsexceeded 表明PHP脚本的执行时间超过了服务器设定的最大执行时间限制。这通常发生在生成静态页面或上传大文件等耗时较长的操作中。解决方案方法一:修改 php.ini 文件找到 php.ini 文件:通常 php.ini 文件位于服务......
  • 后台uedit编辑器内容上传视频失败
    如果在后台使用UEditor编辑器上传视频失败,可以按照以下步骤进行排查和解决:1.检查配置文件首先检查UEditor的配置文件 config.json 是否正确配置了视频上传的相关参数。定位配置文件:找到 UEditor 的配置文件 config.json。检查视频上传配置:确保以下配置项正确......
  • 后台上传大文件时提示上传接口错误
    当网站后台上传文件大于50M时提示上传接口错误,即使已经调整了PHP的文件上传限制和POST限制,以及后台的附件上传大小限制,可能还需要调整Apache的配置。解决方法1.调整Apache配置打开Apache配置文件:打开Apache的主配置文件 httpd.conf。通常该文件位于 /etc/httpd/conf/ 或......
  • LeetCode力扣——并查集:947. 移除最多的同行或同列石头,1971. 寻找图中是否存在路径,24
    947.移除最多的同行或同列石头题目描述947.移除最多的同行或同列石头n 块石头放置在二维平面中的一些整数坐标点上。每个坐标点上最多只能有一块石头。如果一块石头的 同行或者同列 上有其他石头存在,那么就可以移除这块石头。给你一个长度为 n 的数组 stones ,其......