web-dev-qa-db-fra.com

PHP Data-URI to file

J'ai un URI de données que j'obtiens de javascript et j'essaye d'enregistrer via php. J'utilise le code suivant qui donne un fichier image apparemment corrompu:

  $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

Sous le code se trouve l'image réelle sous forme d'URI de données. 'logoImage' est la chaîne ci-dessus, et $ uri est la chaîne moins 'image/jpeg; base64,'.

48
GAgnew

Un coup d'œil rapide au PHP manual donne ce qui suit:

Si vous souhaitez enregistrer des données dérivées d'une fonction Javascript canvas.toDataURL (), vous devez convertir les blancs en plus. Si vous ne le faites pas, les données décodées sont corrompues:

<?php
  $encodedData = str_replace(' ','+',$encodedData);
  $decodedData = base64_decode($encodedData);
?>
70
Paul S.

L'URI de données que vous avez dans votre exemple n'est pas une image PNG valide. Cela ne fonctionnera jamais et n'est pas lié au code, il est lié aux données.


Ne s'applique pas mais pourrait être intéressant:

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

L'idée derrière: PHP lui-même peut lire le contenu de RI de données (data://) vous n'avez donc pas besoin de le décoder vous-même.

Notez que le schéma d'URI de données officiel (ref: Le schéma d'URL "data" RFC 2397 ) ne comprend pas de double barre oblique ("// ") après les deux points (" : "). PHP prend en charge avec ou sans les deux barres obliques.

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

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

Tout le code qui fonctionne:

$imgData = str_replace(' ','+',$_POST['image']);
$imgData =  substr($imgData,strpos($imgData,",")+1);
$imgData = base64_decode($imgData);
// Path where the image is going to be saved
$filePath = $_SERVER['DOCUMENT_ROOT']. '/ima/temp2.png';
// Write $imgData into the image file
$file = fopen($filePath, 'w');
fwrite($file, $imgData);
fclose($file);
27
Christophe