Проблема с динамической генерацией 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 получает правильный код, но изображение не визуализируется.Кто-нибудь знает, что здесь нужно изменить?
Решение
В соответствии с SVG-страница в википедии, SVG должен подаваться как image/svg+xml
.
Смотрите также : 1.2 Тип SVG MIME, расширение имени файла и тип файла 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 корректно отображается 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.
<?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>
Хитрость заключалась в том, чтобы использовать префикс svg: для каждого элемента. Он должен знать пространство имен, чтобы оно было правильно проанализировано браузером.
Затем я обнаружил библиотеку Raphael Javascript http://raphaeljs.com/ , которая делает обработку объектов SVG очень простой. р>
Надеюсь, это поможет