头像上传二三事

之前注册功能还留了一个小尾巴:完善图像上传功能。之前只是简单的input上传,没有图片做任何处理。

以下说的就是如何将图片进行裁剪得到需要的尺寸并上传。(参考文献:http://www.open-open.com/lib/view/open1464825507226.html)

并将这些功能进行了简单的封装 (https://github.com/zhangdongming1989/upload_helper)

1.图片DataUri

看到这个需求不由得想到了之前看到的dataUri。dataUri实际上就是一个规定格式字符串。这个字符串实际就是是用base64编码后的图片数据。

比如这就是一个datauri图片

data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub//ge 8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1h LnjM5UUde0ECwLJoExKcppV0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g 77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7

把这一段粘贴到浏览器地址栏就会出现一张小图片。

这样做的好处是可以直接把datauri加到css或者html中,而不用再单独传一个图片——减少http请求。但是也有问题,base64要比二进制编码大1/3。在处理图片的过程中会多次涉及datauri,但是最终没有用它做传输格式,因为我们的后台存的都是单独的图片文件。

2.实现流程

uploadHelper=function(event,imgSize,returnType,callback)

这个是暴露的程序入口,需要放到文件input的onchange监听事件回调中。第一个event就是这个change事件,之后的参数是图片尺寸,输出类型,完成回调。

下面是一个例子,其中dataUri是一个img标签

var oFile=document.querySelector(‘#file-input‘);
    var oDataUri=document.querySelector(‘dataUri‘);
    oFile.onchange=function (event) {
        uploadHelper(event,{width:100,height:100},‘dataUri‘,function (dataURI) {
            document.querySelector(‘#dataUri‘).src=dataURI;
        });
    };

下面按照数据流来说明处理过程,这一系列过程中存在大量异步回调,所以数据流和程序编写顺序有些区别。

用event.target.file[0]拿到文件之后调用

function compressImage(file,size,callback)

这个方法是resize图片的主程序,然而这个方法没什么实际内容。其中会调用方法

fileToDataUrl(file,function (dataUrl)

这个方法的作用是将file转换成dataUri,当然这一步并不是必需的。

转换成datauri之后就到了压缩的核心方法

function compressDataUrl(dataURL,size,callback)

这个方法的思路是创建一个图片实例,将之前得到的datauri赋给它的img.src,然后使用canvas的图片重绘方法

ctx.drawImage(img,cutL,cutT,cutW,cutH,0,0,canvas.width,canvas.height);

参考文献:http://www.w3school.com.cn/tags/canvas_drawimage.asp

关于drawImage,首先这个方法是不是在canvas上,而是在canvas的上下文(context)上的一个方法。

其次,这个方法的参数比较多,因为这个方法需要让你指定用哪个图片作为源文件(img),之后四个cut开头的参数是让用户指定原图上绘制的起始坐标(cutL,cutT),然后

指定取原图多长多宽进行绘制(cutW,cutH)。之后是在canvas画布的哪个坐标开始绘制(0,0)最后是指定画布上新图像的宽高。其中除了0,0 以及我们指定的新图片大小以外都      需要进行计算。计算的思路是:既然指定了新图片的长宽,那么要想让新图片不发生长或者宽的拉伸/压缩,需要保证原图宽高比和新图一致,如果不一致就裁剪掉。裁剪的时候默    认是左右对称裁剪,取得中间部分。

绘制结束之后将canvas转成datauri格式。值得一提的是,对于某一格式,图片大小基本是和尺寸相关的,100*100的图片只有5k左右大小

如果你需要将文件作为表单的一项上传,也许你还需要转成blob文件。实际上,对于有input=file表单(请求格式:multipart/form-data),

其中的文件(非字符串)上传都是用的blob格式。转化可以使用方法

function dataUriToBlob(dataUri)

这个方法做的事情就是把dataUri的字符串分隔解析,因为datauri除了数据还有文件格式。

最后创建blob文件。

3.后台接收

在这之后有一个问题困扰了我许久:blob文件后台怎么转成原来的格式(比如jpg)?

在我面对收到的blob文件一脸懵逼的许久之后,请教了老张,老张很自然的打开了blob文件所在的文件夹,然后我看到了图片预览。。。(至少ubuntu下是可以看的)

这时候我才知道,实际上是不用转格式的,我差的只是一个后缀。(比如.jpg)

然后稍微改了下multer的设置就可以了。

http://www.w3school.com.cn/tags/canvas_drawimage.asp

时间: 2024-10-10 13:02:12

头像上传二三事的相关文章

ckeditor图片上传二三事

最近实验室要用ckeditor,踩了几个小坑记录下. 1.出现iframe跨域问题 response.setHeader("X-Frame-Options", "SAMEORIGIN");或者在websecurityconfig中添加http.headers().frameOptions().disable(); 2.接参一定要注意前台file的name是什么

qt实现头像上传功能

想必大家都使用过qt的自定义头像功能吧,那么图1应该不会陌生,本片文章我就是要模拟一个这样的功能,虽然没有这么强大的效果,但是能够满足一定的需求. 图1 qq上传图片 首先在讲解功能之前,我先给出一片文章,QT实现的类似QQ的头像选择框,这篇文章也是讲解头像上传功能的,而我自己的代码是从这个demo中优化而来,不仅对代码进行了重构,而且处理了快速拖动时,边框消失的问题.使用事件和双缓冲来尽量减少重新绘制的几率.接下里我会一步一步进行讲解,怎么实现图片自定义截取功能.一.概要首选,我给出4个类,并

php+flash头像上传组件

有会员系统的网站一般都会有一个头像上传组件,一般做的最简单的是 这种方式优点是代码写的简单,只要判断图片大小和类型,然后更新数据库.但是用户体验不高.而且网站其他页面如果要使用较小的20X20或148X148大小的图片时会出现图片模糊或图片加载过大. 而第二种方式,是我们今天要介绍的方式.样式如下 步骤如下: 一.下载文件 php+flash头像上传组件 http://download.csdn.net/detail/tomyjohn/8049273 二.可以直接解压至你的服务器目录 三.文件a

SSH系列:(10)用户管理-用户头像上传

用户头像上传是使用Struts的上传功能,因此需要遵循Struts上传文件的方式. 基本步骤: 1. 在JSP中使用 HTML 表单上传文件, 须把 HTML 表单的 enctype 属性设置为 multipart/form-data, method 属性设置为 post.HTML表单中包含<input type="file"> 使用户能选择上传文件. 2. Action 中添加三个文件上传相关的属性. 上传单个文件属性格式 属性一:类型为File,名字为页面file控件名

富头像上传编辑器文档(from www.sysoft.cc)

调用方法 new fullAvatarEditor(swfContainerID, [height], [width], flashvars, [callback]); 返回值:object,该对象可调用call方法,请参见 call方法. swfContainerID 用以包裹Flash的HTML元素的ID. height Flash的高度,默认为 600. width Flash的宽度,默认为 630. flashvars 配置参数 名称 类型 默认值 描述 id String fullAv

Java头像上传方法

import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; /** * Created by Zenz. */ public class Upload { /** * 头像上传 * @param headImage 头像传出文件 * @param reque

头像上传组件,后台安全控制

http://www.hdfu.net/demo.html flash头像上传组件 http://deepliquid.com/content/Jcrop.html jcrop组件   裁切头像 登录数据库表的建立 create table hnsc_user( account varchar(50) primary key, pwd varchar(50), -- 密码 truename varchar(50),-- 真是姓名 face varchar(200), -- 注册时上传的头像 wh

[Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能

很久没有更新博客了,再不写点东西都烂了. 这次更新一个小内容,是两个插件的组合使用,实现头像上传功能. 业务需求: 头像上传功能,要对上传的文件进行剪切,且保证头像到服务器时必须是正方形的. 优化<input type="file">的显示样式,基础的样式实在太难看了. 上传的头像需要进行质量压缩跟大小裁剪,以减缓浏览器的压力. 成果预览: 使用到的技术插件 Jcrop:用于前端"裁剪"图片 bootstrap-fileinput:用于前端优化上传控件样

php头像上传预览

php头像上传带预览: 说道上传图片,大家并不陌生,不过,在以后开发的项目中,可能并不会让你使用提交刷新页面式的上传图片,比如上传头像,按照常理,肯定是在相册选择照片之后,确认上传,而肯定不会通过form表单,点击submit刷新式上传.我为大家介绍两种异步非刷新式上传图片+图片预览:第一种,通过现成的uploadfy插件进行上传,网上好多实例.不过我重点为大家介绍的是第二种,通过Ajax上传图片.因为使用uploadfy插件需要设备支持swf格式的Flash,所以对大多数手机来说,第一种方式就