Проблема с динамической генерацией SVG-изображений
Я пытаюсь написать скрипт на стороне сервера (PHP) для создания образа SVG на основе пользовательского ввода. Я использую следующий код:
<?php
echo '<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<head><meta http-equiv="Content-Type" content="svg+xml" /></head>
<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
<circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red"/>
</svg>';
?>
Я где-то читал, что тип MIME должен быть svg+xml, поэтому я попытался установить его в content-type, как вы можете видеть выше. Правильный код поступает в Firefox, но изображение не отображается. Кто-нибудь знает, что здесь можно изменить?
3 ответов:
Согласно странице SVG в Википедии, SVG следует подавать как
image/svg+xml. См. также : 1.2 тип MIME SVG, расширение имени файла и тип файла MacintoshСледующая мета:
<meta http-equiv="Content-Type" content="svg/xml" />Не определяет способ подачи контента с сервера - это скорее способ предоставления этой информации для HTML-страниц, когда вы не можете определить способ его подачи...
и, я не уверен, что мета-элемент допустим в спецификации SVG -- я позволю тебе проверить это.^^
То, что вам нужно сделать, это отправить HTTP-заголовок с вашего сервера, указав тип содержимого ваших данных.Это делается с помощью PHP
headerфункция ; в вашем случае:header('Content-type: image/svg+xml'); echo '<?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg"> <circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red"/> </svg>';Примечание:
- я удалил теги
<meta>и<head>; не уверен, следует ли удалять<head>, но, поскольку он был пуст....- я добавил вызов функции
header- Красный SVG circle правильно отображается firefox -- так, кажется, работает ; -)
Надеюсь, это поможет !
Просто говорю, что это:
<?xml version='1.0'?> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <head><title>test</title></head> <body> <svg:svg id="display" width="500" heigth="500" viewBox="0 0 500 500"> <svg:rect width="50" height="50" x="100" y="100" fill="red" stroke="black" /> </svg:svg> </body> </html>Будет работать так же, как это:
<?xml version='1.0'?> <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>test</title></head> <body> <svg id="display" width="500" heigth="500" viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <rect width="50" height="50" x="100" y="100" fill="red" stroke="black" /> </svg> </body> </html>Вы можете сами решить, что более читабельно / чисто. Если вы используете много SVG-фрагментов, то в некоторых случаях имеет смысл поместить xmlns-объявления на корневой элемент html, как в первом примере.
Недавно мне удалось использовать svg в документе xhtml.
Хитрость заключалась в том, чтобы использовать префикс svg: для каждого элемента. Он должен знать пространство имен, чтобы быть правильно проанализирован браузером.<?xml version='1.0'?> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <head><title>test</title></head> <body> <svg:svg id="display" width="500" heigth="500" viewBox="0 0 500 500"> <svg:rect width="50" height="50" x="100" y="100" fill="red" stroke="black" /> </svg:svg> </body> </html>Затем я открыл библиотеку Javascript Рафаэля http://raphaeljs.com/, что делает обработку svg-объектов очень легкой.
Надеюсь, это поможет
Comments