PHP Data-URI to file

2022-08-30 10:21:43

我有一个从javascript获得的数据URI,并试图通过php保存。我使用以下代码,它给出了一个明显损坏的图像文件:

  $data = $_POST['logoImage'];

  $uri = substr($data,strpos($data,",")+1);

  file_put_contents($_POST['logoFilename'], base64_decode($uri));



data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs 9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAxklEQVQYlYWQMW7CUBBE33yITYUUmwbOkBtEcgUlTa7COXIVV5RUkXKC5AxU EdyZVD4kyKxkwIrr9vd0c7Oih aopinLNsF6Qkg2XW4XJ7LGFsAAcTV6lF5/jLdbALA9XDAXYfthFQVx OrmqKYK88/7rbbMFksALieTnzu9wDYTj6f70PKsp2kwAiSvjXNcvkWpAfNZkzWa/5a9yT7fdoX7rrB7hYh2fXo9HdjPYQZu3MIU8bYIlW20y0RUlXG2Kpv/vfwLxhTaSQwWqwhAAAAAElFTkSuQmCC

代码下方是作为 Data-URI 的实际图像。“logoImage”是上面的字符串,$uri是减去“image/jpeg;base64,”的字符串。


答案 1

快速浏览一下 PHP 手册,可以得出以下结果:

如果要保存从 Javascript 函数派生的数据,则必须将空格转换为加号。如果不这样做,解码后的数据将损坏:canvas.toDataURL()

$encodedData = str_replace(' ','+',$encodedData);
$decodedData = base64_decode($encodedData);

答案 2

示例中的数据 URI 不是有效的 PNG 图像。这永远不会起作用,并且与代码无关,它与数据有关。


不适用,但可能会引起人们的兴趣:

file_put_contents($_POST['logoFilename'], file_get_contents($data));

背后的想法:PHP本身可以读取数据URI的内容(data://),所以你不需要自己解码它。

请注意,官方数据 URI 方案(参考:“数据”URL 方案 RFC 2397)在冒号 (“”) 后不包含双斜杠 (“)。)。PHP 支持带或不带两个斜杠。//:

 # RFC 2397 conform
 $binary = file_get_contents($uri);

 # with two slashes
 $uriPhp = 'data://' . substr($uri, 5);
 $binary = file_get_contents($uriPhp);

推荐