У меня в base64 закодирована строка в поле $ _POST $_POST['nimage']
если я повторяю это непосредственно как значение SRC в img
тег, я вижу изображение просто отлично в браузере: echo "<img src='".$_POST['nimage']."'>";
Теперь я явно пропускаю шаг, потому что, когда я base64_decode
строку и записать ее в файл локально на сервере, попытка просмотра созданного файла в браузере приводит к ошибке:
«Изображение« xxxx: //myserversomewhere.com/images/img1.jpg »не может быть отображено, поскольку оно содержит ошибки»
Мой декодер и файл положены:
$file = base64_decode($_POST['nimage']);
file_put_contents('images/'. $_POST['imgname'], $file);
что приводит к images/img1.jpg
на локальном сервере. Что я делаю не так в декодере здесь? Несмотря на то, что вывод base64, по-видимому, не является URL-кодированным, я попытался использовать urldecode () на нем перед base64_decode () просто для безопасной меры с теми же результатами.
Первые несколько строк кода base64:
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAF4AqsDAREAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2gJt+XPJPUGv2A/NB2044oAdtY9M8ccCgB6r8+0jtSYDxEW4xz2qQFCnGOPQ0AAQDJIz9KAF8rI6/hQA9Y+SBgjHIqWA5Yxz2xUsBwUdAMdzSAcFGAB0NADgCVK/KB/OgB6BNzc49agse2OgX2BFZvcCRUO7g
К данным, которые вы декодируете, прикреплен заголовок URI данных:
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD...
Заголовок используется браузером для определения типа файла и кодировки, но не является частью закодированных данных.
Снять заголовок (data:image/jpeg;base64,
) из данных и base64 расшифровывают все остальное, прежде чем записать его в файл.
$b64 = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD...';
$dat = explode(',' $b64);
// element 1 of array from explode() contains B64-encoded data
if (($fileData = base64_decode($dat[1])) === false) {
exit('Base64 decoding error.');
}
file_put_contents($someFileName, $fileData);
NB. Проверьте возвращаемое значение вашего звонка base64_decode()
за false
и прервать как-нибудь с сообщением. Это приведет к возникновению проблем с процессом декодирования (например, не удаляя заголовок!).
Других решений пока нет …