我刚刚通过自制软件安装了 composer,而 brew 似乎安装了新版本的 php (5.6.24)。从那时起,使用 exif_read_data 提取其他元数据(模型、曝光、iso 等),但不再从照片中提取 GPS 信息,如“GPSLatitude”。
我通过 exiftool(独立的非 php 程序)运行了同一张照片,照片中确实存在 GPS 数据。
PHP 是用 exif 编译的(因为提取了一些信息),所以我很困惑为什么不再读取 GPS 数据。
最佳答案
这很可能是由于安全修复的回归导致 ext/exif 扩展在“未知”格式的情况下停止解析。
这应该在 7.x 分支(7.0.10 和 7.1.0 Beta 1)中修复应该包含对这些的适当修复,虽然它没有合并到 5.x 分支,它可能会找到它的方式那里。
如果你想要一个补丁(应该很容易转换成 5.x),那么我在这里提交: http://git.php.net/?p=php-src.git;a=commit;h=aabcb5481d9e717df77192dab2894468b9fc63b4
这里有一些关于 ext/exif 的工作原理和错误的背景:
在内部,当我们解析 exif 数据时,它会读出规范提供的标准 exif 标签,但是某些格式具有某些自定义标签。这些通常也会被解析,但是 ext/exif 的局限性在于我们仅(在包括 7.1 在内的稳定分支中)支持 6 种带有扩展标签的格式(每种格式的列表都包含在扩展中)。这就是回归的用武之地。在解析 EXIF 数据时,它按以下顺序完成:
安全修复导致了回归,因为您可以制作假签名并在内部绕过它,这可能会导致无效读取。如果我们知道的格式中烘焙的签名列表中的签名不匹配,修复程序将停止解析,从而停止解析并且不返回像缩略图这样的数据,导致 exif_thumbnail() 基本上不能用于除了 6格式。
目前在 7.x 分支中的修复恢复了这种行为并简单地继续解析那些额外的标签,因此我们不直接支持的那些函数和其他格式将再次起作用。
除此之外,在 7.2 中,我一直在添加对 Samsung、Panasonic 和 DJI 特定标签的支持,目前我也在研究 Sony 特定数据。我们在 php.net 上有一个错误报告,如果您有兴趣更深入地了解它,它会闪闪发光:https://bugs.php.net/bug.php?id=72735 .如果此补丁无法解决您的问题,我们非常欢迎您提交错误报告,以便我们研究解决此问题。
我希望这对您有所帮助,感谢您帮助使 PHP 变得更加强大!
关于PHP exif_read_data 不再提取 GPS 位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38772471/
CSV.open(name,"r").eachdo|row|putsrowend我得到以下错误:CSV::MalformedCSVErrorUnquotedfieldsdonotallow\ror\n文件名是一个.txt制表符分隔文件。我是专门做的。我有一个.csv文件,我转到excel,并将文件保存为.txt制表符分隔的文件。所以它是制表符分隔的。CSV.open不应该能够读取制表符分隔的文件吗? 最佳答案 尝试像这样指定字段分隔符:CSV.open("name","r",{:col_sep=>"\t"}).eachdo|row|
“输出”是一个序列化的OpenStruct。定义标题try(:output).try(:data).try(:title)结束什么会更好?:) 最佳答案 或者只是这样:deftitleoutput.data.titlerescuenilend 关于ruby-on-rails-更好的替代方法try(:output).try(:data).try(:name)?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c
Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba
我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束
我有一个.pfx格式的证书,我需要使用ruby提取公共(public)、私有(private)和CA证书。使用shell我可以这样做:#ExtractPublicKey(askforpassword)opensslpkcs12-infile.pfx-outfile_public.pem-clcerts-nokeys#ExtractCertificateAuthorityKey(askforpassword)opensslpkcs12-infile.pfx-outfile_ca.pem-cacerts-nokeys#ExtractPrivateKey(askforpassword)o
我在我正在处理的一些代码中发现了这一点。它旨在解决从磁盘读取key文件的要求。在生产环境中,key文件的内容位于环境变量中。旧代码:key=File.read('path/to/key.pem')新代码:key=File.read('|echo$KEY_VARIABLE')这是如何工作的? 最佳答案 来自IOdocs:Astringstartingwith“|”indicatesasubprocess.Theremainderofthestringfollowingthe“|”isinvokedasaprocesswithappro
我有这个代码File.open(file_name,'r'){|file|file.read}但是Rubocop发出警告:Offenses:Style/SymbolProc:Pass&:readasargumenttoopeninsteadofablock.你是怎么做到的? 最佳答案 我刚刚创建了一个名为“t.txt”的文件,其中包含“Hello,World\n”。我们可以按如下方式阅读。File.open('t.txt','r',&:read)#=>"Hello,World\n"顺便说一下,由于第二个参数的默认值是'r',所以这样
我有以下代码,它下载一个文件,然后将文件的内容读入一个变量。使用该变量,它执行一个命令。这个配方不会收敛,因为/root/foo在编译阶段不存在。我可以通过多个聚合和一个来解决这个问题ifFile.exist但我想用一个收敛来完成它。关于如何做到这一点有什么想法吗?execute'download_joiner'docommand"awss3cps3://bucket/foo/root/foo"not_if{::File.exist?('/root/foo')}endpassword=::File.read('/root/foo').chompexecute'join_domain'd
我将Cucumber与Ruby结合使用。通过Selenium-Webdriver在Chrome中运行测试时,我想将下载位置更改为测试文件夹而不是用户下载文件夹。我当前的chrome驱动程序是这样设置的:Capybara.default_driver=:seleniumCapybara.register_driver:seleniumdo|app|Capybara::Selenium::Driver.new(app,:browser=>:chrome,desired_capabilities:{'chromeOptions'=>{'args'=>%w{window-size=1920,1
我正在尝试提取方括号内的内容。到目前为止,我一直在使用它,它有效,但我想知道我是否可以直接在正则表达式中使用某些东西,而不是使用这个删除功能。a="Thisissuchagreatday[coolawesome]"a[/\[.*?\]/].delete('[]')#=>"coolawesome" 最佳答案 差不多。a="Thisissuchagreatday[coolawesome]"a[/\[(.*?)\]/,1]#=>"coolawesome"a[/(?"coolawesome"第一个依赖于提取组而不是完全匹配;第二个利用前瞻和