`
litaocheng
  • 浏览: 337717 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

检测image类型及尺寸的erlang模块

阅读更多
Socklabs在其项目中需要限制用户上传的图片类型为gif,png和jpeg, 同时图片文件大小必须 < 4M, 图片尺寸小于2048*2048.这个模块很简单,以binary的方式读取文件,随后通过图片相应的格式解析,获取格式,尺寸相关信息.随后可以做出判断.

代码:

-module(ipwfiles_image).
-export([image_type/1]).

-compile([export_all]).

image_type(File) when is_list(File) ->
    case file:read_file(File) of
	{ok, Data} ->
		image_type(Data);
	_ ->
		{error, openfile}
    end;

%% Gif header, width and height
%% http://www.etsimo.uniovi.es/gifanim/gif87a.txt
image_type(<<$G, $I, $F, $8, $9, $a, Width:16/little, Height:16/little, _/binary>>) ->
    {gif, Width, Height};
image_type(<<$G, $I, $F, $8, $7, $a, Width:16/little, Height:16/little, _/binary>>) ->
    {gif, Width, Height};

%% Png header
%% ref: http://www.w3.org/TR/PNG/#5DataRep
image_type(<<137, 80, 78, 71, 13, 10, 26, 10, _:4/signed-integer-unit:8, 73, 72, 68, 82, Width:32/signed-big, Height:32/signed-big, _/binary>>) ->
    {png, Width, Height};

%% Jpeg header
%% ref:http://en.wikipedia.org/wiki/Jpeg#JPEG_files
%%     http://www.obrador.com/essentialjpeg/headerinfo.htm

image_type(<<16#FF, 16#D8, JpegData/binary>>) ->
    {W, H} = parse_jpeg(JpegData),
    {jpeg, W, H};

image_type(_) ->
    unknown.

parse_jpeg(Jpeg) ->
    parse_jpeg(Jpeg, {}).

parse_jpeg(<<>>, Results) -> Results;
parse_jpeg(<<16#FF, 16#C0, _:16, _:8, Height:16/signed-big, Width:16/signed-big, _/binary>>, _) ->
    parse_jpeg(<<>>, {Width, Height});
parse_jpeg(<<_:8, Rest/binary>>, Results) ->
    parse_jpeg(Rest, Results).

好了,检测图片类型及尺寸的模块就完成了.
让我们彻底完成Socklabs遇到的这个问题吧,判断一个输入的文件是否符合要求.
代码: ipwfiles.erl

-module(ipwfiles).
-export([image_valid/1]).

-compile([export_all]).
-include_lib("kernel/include/file.hrl").
-define(MAX_IMG_SIZE, 4*1024*1024).	% max image file size
-define(MAX_IMG_WIDTH, 2048).
-define(MAX_IMG_HEIGHT, 2048).

image_valid(File) when is_list(File) ->
    {ok, FileInfo} = file:read_file_info(File),
    if
	FileInfo#file_info.size > ?MAX_IMG_SIZE ->
	    {false, image_size_too_big};
	true ->
	    case ipwfiles_image:image_type(File) of
		unknown ->
		    {false, image_type_invalid};
		{Type, Width, Height} when Width 
                            =< ?MAX_IMG_WIDTH andalso Height =< ?MAX_IMG_HEIGHT ->
		    case Type of
			gif ->
			    true;
			jpeg ->
			    true;
			png ->
			    true
		    end;
		{_, _, _} ->
		    {false, image_dimension_invalid}
	    end
    end.

大功告成,测试一下吧:

> c(ipwfiles_image).
{ok,ipwfiles_image}
> c(ipwfiles).
{ok,ipwfiles}
> ipwfiles:image_valid("d:/IPMSG.exe").
{false,image_type_invalid}
> ipwfiles:image_valid("d:/book.png").
{false,image_dimension_invalid}
> ipwfiles:image_valid("d:/book.gif").
true

总结一下,主要就是用到binary匹配和文件读取,其他就是参考图片的格式进行判断了.
分享到:
评论

相关推荐

    erlang两种参数模块化

    从给定的文件信息中,我们可以提炼出一些关于Erlang语言以及其参数化模块的重要知识点。 首先,Erlang是一种严格、动态类型的函数式编程语言。它的特点是没有破坏性更新,即数据不可变。Erlang内置了对并发的支持,...

    erlang 参考手册 模块部分--自己翻译的中文版

    Erlang是一种面向并发、分布式计算的编程语言,它的源代码是组织在模块(module)中的。模块是Erlang程序的基本单位,包含了特性(attribute)和函数(function)声明。下面将详细介绍Erlang模块的规则、特性、...

    erlang 设计指南

    模块是Erlang代码的基本组织单位,可以包含函数和记录。记录类似于结构体,提供了一种命名字段的数据结构。模块间通过导出和导入函数来实现接口交互,便于代码复用和维护。 在分布式系统方面,Erlang节点可以在网络...

    erlang趣学指南

    这本书的作者Fred Hébert是一位在一线拥有丰富实战经验的工程师,他通过轻松幽默的文风和清晰的讲解,向读者介绍了Erlang的模块、函数、类型、递归、错误处理、数据结构、并行编程、多处理、事件处理以及Erlang的...

    erlang编程 Introducing Erlang

    **Erlang编程:Introducing Erlang** Erlang是一种函数式编程语言,由爱立信在1986年开发,主要用于构建高可用性、容错性和并发性的分布式系统。"Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,...

    erl-templates:Erlang 模块模板

    **Erlang 模块模板** 是一个针对 Erlang 编程语言的工具,它提供了一种方便的方式来创建和管理代码模板。Erlang 是一种并发性极强、功能丰富的编程语言,尤其适用于构建分布式系统和高可用性的软实时应用。在 Erlang...

    erlang_版本24.3.4.4

    - **Erlang的数据类型**:包括原子(atom)、整数、浮点数、字符串、列表、元组、位串等。 - **Pattern Matching**:Erlang的匹配操作符`=`允许在函数调用、case语句和receive语句中进行模式匹配。 熟悉这些概念和...

    英雄远征源码[erlang]

    Erlang是一种动态类型的并发编程语言,源于瑞典电信设备制造商Ericsson的需求,旨在创建高效、可靠和可维护的软件。它支持轻量级进程(process)、消息传递以及热代码升级,这使得Erlang特别适合处理大量并发连接和...

    erlang资源

    3. **过程和模块**:Erlang的组织方式,包括如何定义和调用函数,以及模块的使用。 4. **错误调试**:Erlang的错误处理机制,如shell的使用、日志和调试工具。 5. **REPL(Read-Eval-Print Loop)**:Erlang shell...

    Erlang开发及应用

    Erlang开发及应用

    erlang中文基础教程

    模块名必须和文件名相同,否则 Erlang 无法找到模块。函数是模块中的基本单元,用于实现具体的计算任务。 在 Erlang 中,用户可以使用模块和函数来实现复杂的计算任务。例如,用户可以创建一个模块,定义一个函数来...

    erlang9.rar

    Erlang还有强大的模块系统,每个文件对应一个模块,模块内包含函数定义。 OTP库提供了许多实用的模块,如gen_server、gen_event和gen_fsm,这些都是Erlang并发编程的基础。 总而言之,Erlang9.rar是一个包含Erlang/...

    erlang25.0 windows版本

    2. **API更新**:可能对Erlang的内置函数或模块进行增强,提供新的功能或修复已知问题。 3. **兼容性提升**:与先前版本相比,25.0可能增强了与其他软件或框架的兼容性。 4. **错误修复**:解决上一版本中的已知问题...

    Erlang趣学指南

    (494页带目录的高清扫描版) 这是一本讲解Erlang编程语言的入门指南,内容通俗...内容涉及模块、函数、类型、递归、错误和异常、常用数据结构、并行编程、多处理、OTP、事件处理,以及所有Erlang的重要特性和强大功能。

    xiandiao_erlang_Erlang课后习题_

    5. **模块化编程**:Erlang的模块系统可以帮助组织代码,习题可能要求学习者将功能分解到多个模块中,提高代码的可重用性和可读性。 6. **性能优化**:通过解决实际问题,学习者可以学习到如何有效地利用Erlang的...

    erlang 部分源码

    Erlang是一种面向并发的、动态类型的编程语言,主要用于构建高可用性、容错性和分布式系统。这个压缩包包含的是Erlang的部分源代码,尽管可能不完整,但仍然能够提供对Erlang语言实现机制的深入了解。 1. **Erlang...

    《Programming Erlang》

    8. **错误处理**:Erlang鼓励使用“失败-快速”策略,即在检测到错误时立即崩溃,然后由Supervisor树自动重启,以恢复系统的稳定状态。 9. **模式匹配**:Erlang中的模式匹配是其语法的一个强大特性,可以方便地...

    两本erlang电子书

    此外,这本书还会讨论Erlang的模块系统、类型系统以及如何利用REPL(Read-Eval-Print Loop)进行调试和测试。 这两本书的结合,为学习Erlang提供了全面的视角。《Erlang and OTP in Action》以其实践导向,帮助...

    erlang nif test

    Erlang NIF(Native Implemented Functions)是Erlang虚拟机提供的一种机制,允许开发者用C语言或者其他低级语言编写性能关键部分的代码,并在Erlang系统中无缝调用。这种方式可以充分利用C语言的高效性,同时保持...

    erlang 中文基础教程

    ### Erlang 中文基础教程:理解Erlang Shell与模块函数 #### 1. Erlang Shell:编程者的交互式环境 Erlang Shell是Erlang编程语言提供的一种交互式编程环境,允许开发者直接在命令行中编写、执行Erlang代码并观察...

Global site tag (gtag.js) - Google Analytics