Maison >développement back-end >Problème PHP >Que faire si l'encodage php base64 est tronqué

Que faire si l'encodage php base64 est tronqué

PHPz
PHPzoriginal
2023-04-24 14:51:082329parcourir

Récemment, lors du développement d'une application Web basée sur la séparation front-end et back-end, j'ai rencontré un problème assez difficile : une fois que le front-end utilise JavaScript pour encoder l'image en base64, elle est transmise au programme PHP back-end pour décodage, et le résultat est un code tronqué.

Après de nombreuses tentatives et recherches, j'ai résumé quelques solutions et les partage avec vous pour votre référence.

Tout d’abord, comprenons les principes de base de l’encodage et du décodage base64. Base64 est une méthode qui utilise 64 caractères pour représenter les données binaires. Les données sont classées en groupes de 6 bits. Les caractères correspondants se trouvent dans le jeu de caractères prédéfini en fonction de la valeur de 6 bits pour remplacer le bytecode dans les données binaires d'origine. De cette manière, toutes les données peuvent être converties en caractères ASCII imprimables pour faciliter la transmission et le stockage.

En JavaScript, vous pouvez générer une chaîne codée en base64 contenant des données d'image en appelant la fonction toDataURL() de l'objet canevas :

var canvas = document.createElement('canvas');
canvas.width = 400;
canvas.height = 300;
var ctx = canvas.getContext('2d');
ctx.fillStyle = '#fff';
ctx.fillRect(0, 0, 400, 300);
var img = new Image();
img.src = './test.jpg';
img.onload = function() {
  ctx.drawImage(img, 0, 0, 400, 300);
  var dataURL = canvas.toDataURL('image/jpeg', 0.8);
  // 传输dataURL给后端进行base64解码
};

En PHP, vous pouvez utiliser la fonction base64_decode() pour décoder la chaîne codée en base64 en données binaires brutes, continuez.

Cependant, lors du fonctionnement réel, nous avons constaté que des codes tronqués apparaissent parfois. Pourquoi ?

Les raisons des caractères tronqués sont les suivantes :

  1. la chaîne base64 contient data:image/jpeg;base64 et d'autres préfixes et délimiteurs, qui doivent d'abord être supprimés.
  2. La chaîne base64 contient des caractères codés en URL, tels que +, /, etc., qui doivent être décodés avant le décodage.
  3. L'option magic_quotes_gpc est activée dans la configuration PHP, ce qui provoque l'échappement de caractères tels que les guillemets simples et les guillemets doubles, provoquant des problèmes lors du décodage.
  4. Pendant le processus de transmission, pour diverses raisons (telles que des problèmes d'encodage chinois, etc.), une partie des données est modifiée, ce qui à son tour affecte le décodage base64.

La solution est la suivante :

  1. Supprimer les préfixes et les délimiteurs

Vous pouvez utiliser le remplacement de chaîne pour supprimer les préfixes et les délimiteurs tels que data:image/jpeg;base64, etc., et utiliser directement les chaînes base64 pour le décodage.

$data = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/…'; // base64编码的图片数据
$data = str_replace('data:image/jpeg;base64,', '', $data);
$data = str_replace(' ', '+', $data); // 如果出现URL编码中的+,需要替换成空格。
$data = base64_decode($data);
  1. Décoder les caractères codés en URL

Utilisez la fonction urldecode() pour décoder les caractères codés en URL, puis utilisez base64_decode() pour le décodage en base64.

$data = 'data:image/jpeg;base64,%2F9j%2F4AAQSk...'; // base64编码的图片数据
$data = urldecode($data);
$data = base64_decode($data);
  1. Désactivez l'option magic_quotes_gpc

Recherchez magic_quotes dans php.ini, réglez-le sur Off, puis redémarrez php pour prendre effet.

magic_quotes_gpc = Off
  1. Contrôle de l'intégrité des données

Lors de la transmission de données aux extrémités avant et arrière, l'intégrité des données peut être vérifiée pour garantir qu'elles n'ont pas été modifiées. Par exemple, vous pouvez utiliser md5() pour digérer les données d'origine et les transmettre au backend. Le backend digère ensuite les données binaires reçues et compare les deux valeurs de résumé. Si elles sont identiques, les données n'ont pas été modifiées et les valeurs de résumé sont identiques. une opération de décodage peut être effectuée.

Résumé : 

Ci-dessus sont quelques solutions que j'ai résumées lors de la résolution du problème des caractères tronqués dans le décodage php base64. Vous pouvez choisir et essayer en fonction de votre situation réelle. Lorsque vous développez du Web, n'ayez pas peur lorsque vous rencontrez des problèmes. Essayez davantage et consultez plus d'informations. Je pense que vous trouverez toujours une solution.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn