PHP使用Imagick生成JPG预览图时丢失文件扩展名求助
问题根源:多余的换行符导致文件名异常
你遇到的问题其实是**$key变量里包含了不可见的换行符**,这才是预览图文件名看起来丢失.jpg扩展名的核心原因!
看你代码里的这行:
$key = basename($img,'.jpg').PHP_EOL;
PHP_EOL是对应系统的换行符(Windows下是\r\n,Linux/macOS下是\n),它会被拼接到文件名前缀里,最终生成的文件名其实是类似example\n.jpg这样的格式。操作系统中,文件名里的换行符不会被正常显示,所以你看到的文件名就只剩下example,看起来像是丢失了.jpg扩展名,但实际上扩展名是存在的,只是被换行符隔开,系统无法正常识别展示。
解决方案:移除多余的换行符
只需要去掉拼接的PHP_EOL即可,修改后的代码如下:
修复后的代码示例1:
foreach( glob(dirname(__FILE__)."/../../img/plakate/full/*.jpg") as $img ){ // 移除PHP_EOL,获取正确的文件名前缀 $key = basename($img,'.jpg'); // save preview $thumb = new Imagick($img); $thumb->setImageCompression(Imagick::COMPRESSION_JPEG); $thumb->setImageCompressionQuality(10); $thumb->resizeImage(50,0,Imagick::FILTER_LANCZOS,1); $thumb->writeImage("lib/img/plakate/preview/{$key}.jpg"); $thumb->destroy(); }
修复后的代码示例2:
foreach( glob(dirname(__FILE__)."/../../img/plakate/full/*.jpg") as $img ){ // 移除PHP_EOL,获取正确的文件名前缀 $key = basename($img,'.jpg'); // save preview $thumb = new Imagick($img); $thumb->setImageCompression(Imagick::COMPRESSION_JPEG); $thumb->setImageCompressionQuality(10); $thumb->resizeImage(50,0,Imagick::FILTER_LANCZOS,1); $thumb->setImageFormat('jpeg'); file_put_contents ("lib/img/plakate/preview/{$key}.jpg", $thumb); $thumb->destroy(); }
额外验证小技巧
如果你想直观确认之前的问题,不妨在代码里加一行输出查看实际生成的文件名:
echo "当前生成的文件名:lib/img/plakate/preview/{$key}.jpg\n";
你会看到输出里的文件名中间有明显的换行,这就能一眼发现问题所在了。
内容的提问来源于stack exchange,提问作者WGS
相关产品推荐
相关产品推荐

