Проблема с генерацией динамического SVG-изображения - PullRequest
4 голосов
/ 26 октября 2009

Я пытаюсь написать скрипт на стороне сервера (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, поэтому я попытался установить его в тип контента, как вы можете видеть выше. Firefox получает правильный код, но изображение не отображается. Кто-нибудь знает, что здесь изменить?

Ответы [ 3 ]

24 голосов
/ 26 октября 2009

Согласно странице 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
  • Firefox правильно отображает красный кружок SVG - так что, похоже, работает; -)

Надеюсь, это поможет!

2 голосов
/ 26 октября 2009

Просто говорю, что это:

<?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, как в первом примере.

0 голосов
/ 26 октября 2009

Недавно мне удалось использовать 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 очень простой.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...