Press "Enter" to skip to content

PHP & "Data" URL scheme

缘起最近的一个Feature Request: #62961
早在PHP5.2.0开始, Data URL Scheme(RFC:2397)就已经被PHP的Stream wrapper支持了.
基本上所有的对文件操作的API, 都迁移到的了PHP stream上, 所以, 绝大部分对文件操作的API都是支持Data URL的.
今天这个文章, 就是再次给大家提个醒, 当某个API需要操作对象是文件的时候, 我们其实是可以采用Data URL让他接受一个文件内容字符串的.
比如在#62961中, 请求PHP提供一个exif_imagetypefromstring API, 因为目前的exif_imagetype API只接受文件名, 而提出者已经得到了文件内容在内存中, 不希望只能通过写到一个临时文件, 然后再调用exif_imagetype .

<?php
//we already have $bindata
$tmpfile = tempnam('/tmp', 'upload');
file_put_contents($tmpfile, $bin_data);
$extension = image_type_to_extension(exif_imagetype($tmpfile));
unlink($tmpfile);

那么, 这个时候, 我们就可以借助Data URL了:

<?php
//we already have $bindata
$base64_data = base64_encode($bin_data);
$extension =
   image_type_to_extension(exif_imagetype("data://image/;base64," . $base64_data ));

另外, Data URL还有一个比较常见的使用场景, 比如下面这个图(大家可以查看源代码):
Yaf logo
基本上, 现在主流的浏览器都支持, 这样的方式可以减少一次客户端请求图片.
最后, 此文完全是为了凑数而发, 之前不知道的人, 请笑纳, 以前就知道的人, 请忽略, 嘿嘿

21 Comments

  1. fireboyand-watergirl.com
    fireboyand-watergirl.com December 21, 2018

    基本上, 现在主流的浏览器都支持, 这样的方式可以减少一次客户端请求图片…

  2. Система единой анкеты
    Вы заполняете единую анкету, мы ее анализируем и оправляем в
    лучшие банки соответственно
    Вашим пожеланиям.

  3. Awesome website you have here but I was wondering if you knew of any discussion boards
    that cover the same topics talked about in this article?
    I’d really like to be a part of community where I can get feed-back from other experienced individuals that share the same
    interest. If you have any suggestions, please let me know.
    Cheers!

  4. logiz
    logiz August 31, 2012

    第一次见这东西。

  5. dvaknheo
    dvaknheo August 30, 2012

    那还不如加个函数:
    makefile($bin_data)
    {
    $base64_data = base64_encode($bin_data);
    return (“data://image/;base64,” . $base64_data ));
    }

  6. 天涯
    天涯 August 30, 2012

    @sk.c ie7下也不支持呢

  7. POP
    POP August 30, 2012

    学习了,顺便把相关的知识补补。

  8. sk.c
    sk.c August 30, 2012

    第一次看到Data URL…不过貌似ie 6不支持…好吧,我们不需要兼容IE7以下的了 =。=

  9. 破月亮
    破月亮 August 30, 2012

    学习了,求鸟哥多发帖子多扫盲

  10. 非洲黑馒头
    非洲黑馒头 August 30, 2012

    学习了

  11. charles
    charles August 30, 2012

    科普

Leave a Reply to 海纳百川 Cancel reply

Your email address will not be published. Required fields are marked *