首页 > 其他分享 >移动端上传图片翻转的解决方案

移动端上传图片翻转的解决方案

时间:2024-08-21 14:26:50浏览次数:8  
标签:照片 预览 解决方案 问题 翻转 上传 图片

最近在处理移动端选择图片实时预览并上传时遇到一个问题:上传前图片预览正常,但上传到服务器上的图片展示到页面上时,有时会出现图片翻转的问题,一般是翻转 90 度。后经一翻研究找到了问题所在,特在此记录一下。

问题描述

接上面提到的问题,经过一些测试,发现:如果选取的图片是在横屏状态下拍摄的,则上传后不会出现图片翻转的问题;反之,如果是在竖屏状态下拍摄的,上传后就会出现图片翻转的问题。

问题分析

首先,图片在本地预览时正常,而且前端最后提交到后端的数据是用 FormData 来封装处理的,用 FormData 可以保证提交的数据和通常的表单提交没有什么区别,对后端来说是透明的,后端的处理逻辑不用修改就可以处理带文件的 Ajax 提交。因此,我猜想问题可能出在了后端。

但是后端也没有做什么特殊的处理,怎么展示的时候图片就翻转了呢?

OK,前面提到过这个问题和手机的拍照模式有关,竖屏下拍的照片会重现这个问题,横屏下的则不会。难道这两种模式下拍摄的照片不一样?照片中保存的数据不一样?,这不由的使我想到了 [Exif][] 这个名词,虽然我对它不是十分了解,但是印象中它是用来保存照片的一些元数据信息的,也许和它有关。

简单的一搜索发现:Exif[orientation]有一篇关于它的详细的介绍,此处不展开细讲。简单来说就是它有 8 个值,用来表示照片拍摄时相机旋转的状态,而且我们可以通过编程的方式读取它。我们平常用电脑来查看手机拍摄的照片时也会偶尔出现图片翻转的情况,其原因也是照片查看软件没有根据这个值将照片自动翻转。

经过搜索,在 SO 上找到了相关的问题。其思路就是读取照片的 Exif 信息,判断 Orientation 的值,然后将图片进行相应的旋转。问题已确定,后端同学很快就将这个问题给修复了,并且添加到了他们的公共模块中。

你以为问题就这样解决了,其时并没有。

后续

过了几天,公司购置了几台全新的测试机,测试同学将系统在一台三星的机子上一测,又发现新问题了:选择完图片进行本地预览时,发现图片翻转了!但上传后再展示又是正常的。WTF!

这次没得说了,问题肯定出在了前端预览上。但是之前在安卓和 iOS 的设备上测试都是正常的呀,难道和机型有关?问了一下测试,得知这台三星用的是 Android 5.0 的系统,好先进有木有!这难道是 5.0 中引入的一个问题?别想这些了,反正我们也不可能在系统层面去修复这个问题,还是想想如何去兼容 5.0 吧。

当时想到了两种方法,一种是选择图片后先上传到服务器,再展示上传的图片进行预览。这种方法的优点是兼容性好,前端处理相对简单;缺点是后端要提供图片上传的接口,并且如果用户在保存之前更换图片并不会删除之前上传的图片。移动端的微博配图就是用的这种方法。

另一种方法是在本地进行图片翻转。我们可以使用 FileReader API 来读取图片,之后像后端那样分析 Exif 信息,旋转图片。这种做法的优点是,预览操作完全在本地完成,不会产生不必要的文件上传。缺点是 FileReader 在 Android 4.1 及以上的机型才可以使用,加上前端处理文件数据可能稍显复杂,另外性能也是个问题。

但是最终我们选择了第二种方案。原因是我们之前的照片预览就是用的 FileReader API,不需要考虑低版本安卓的兼容性,这和项目的实际情况有关。另一个原因是我们认为也许有前人已经遇到过这种问题,也许已经有了比较好的处理这个问题的功能模块。后经搜索,找到了一个 fix-orientation 模块,可以通过 npm i fix-orientation --save 使用,具体的用法可以参考项目的文档。后来,扫了一眼它的代码,发现它是用 canvas 来实现图片的旋转,并不会对正常的图片进操作,性能问题不大,iOS 上秒开,安卓设备上稍长,可以添加 loading 效果缓解一下。

至此,问题完美解决。

另外,像 fix-orientation 这样小而美的模块有很多,大家平时可以多关注一下。

原文链接:javascript - 移动端上传图片翻转的解决方案 - 所谓前端 - SegmentFault 思否

标签:照片,预览,解决方案,问题,翻转,上传,图片
From: https://www.cnblogs.com/wyl-1113/p/18371509

相关文章

  • Java中的司机抢单实现:并发问题与解决方案
    文章目录司机抢单的基础实现乐观锁解决并发问题总结在共享经济的浪潮中,像滴滴打车这样的服务已经成为我们生活中不可或缺的一部分。对于司机和平台来说,抢单是一个关键环节,如何在保证系统高效运行的同时,确保抢单过程的公平与准确,是一个值得深入探讨的问题。在这篇博......
  • 配置typora上传图片到Chevereto图床
    目录一、下载安装PicGo二、配置PicGo三、配置Typora一、下载安装PicGoPicGo下载地址点击进入进入官网后点击下载,会跳转到GitHub,如图,选择对应的操作系统版本下载下载完成后单击安装(本文已windows系统为例)二、配置PicGo点击插件设置,搜索插件chevereto并安装......
  • 一站式统一返回值封装、异常处理、异常错误码解决方案—最强的Sping Boot接口优雅响应
    1.前言统一返回值封装、统一异常处理和异常错误码体系的意义在于提高代码的可维护性和可读性,使得代码更加健壮和稳定。统一返回值封装可以避免每一个接口都需要手工拼装响应报文;统一异常处理可以将异常处理的逻辑集中到一个地方,避免代码中出现大量的try-catch语句,降低了代码的......
  • http实现form表单带CSV附件上传,数据不落盘实现方式
    以往的印象里面,实现附件上传需要有附件在磁盘里面存在(可能是见识浅薄),想着怎么去优化一下,避免落盘,就引入了这种方式,实现很容易,只是没有实践过,实践导致认知限制<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</arti......
  • 高密度计算 – 400G超大容量DPI解决方案
    高密度计算–400G超大容量DPI解决方案FPGA硬件加速| 单卡400G流量卸载| 通用x86环境| DPI硬件加速 架构困境:性能的天花板触手可及在过去的二十多年中的大部分时间里,处理器性能以每年大约55%速度快速提升,而内存性能的提升速度却只有每年10%左右。早在1994年,计算机......
  • Java中的分布式缓存解决方案:Redis与Ehcache
    在现代企业级应用中,性能和高可用性是两个重要的考量因素。分布式缓存作为解决性能瓶颈的有效手段,能有效减轻数据库的压力并提高系统的响应速度。本文将深入探讨Java中两种常用的分布式缓存解决方案:Redis与Ehcache,并通过代码示例演示它们在实际应用中的使用。分布式缓存的基本......
  • 奥威亚云视频平台UploadFile.aspx存在文件上传漏洞
    1前言免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用!!!2漏洞描述为了满足高校培养人才和教学管理的需求,顺应时......
  • el-upload在定义file插槽时删除图片(包括隐藏上传框)
    1.上传框隐藏效果图(限制上传两张图片,上传两张图片后隐藏上传框) <template><div><el-form><el-uploadref="uploadPicture"action="#"list-type="picture-card"......
  • feehicms 文件上传
    侵权声明本文章中的所有内容(包括但不限于文字、图像和其他媒体)仅供教育和参考目的。如果在本文章中使用了任何受版权保护的材料,我们满怀敬意地承认该内容的版权归原作者所有。如果您是版权持有人,并且认为您的作品被侵犯,请通过以下方式与我们联系:[[email protected]]。我们将在确......
  • 【实用】【一眼就会】【直接可用】文件上传 附件上传 前后端分离 分布式 多文件上传
    思路:1、先保存主要信息,存到数据库。2、查询这条数据的id、uid3、上传附件功能:根据id、uid、文件。请求:附件API接口。4、后端接口中:先判断登录状态,5、创建对应的文件夹并存入文件,文件夹名以id名命名。6、把附件名重命名,以uuid命名。7、把所有的文件路径放到集合里,传入id......