关于保存SVG文件和检索的疑问

时间:2012-08-04 23:43:08

标签: php database json file svg

我制作了一个用户上传Gerber文件(印刷电路板格式)的系统,然后我用PHP将该文件(GCode)转换为SVG。

我现在面临一个问题,这实际上是一个建筑问题。

我应该将SVG保存在文件中还是数据库中?

我应该将SVG作为JSON返回({name:test,data:SVGFILEGOESHERE})还是只渲染为.svg?我的意思是,JSON对于大数据结构是否足够安全?

编辑:

转换的SVG将在网站的许多视图中使用,例如:产品页面,配置页面...它不会只显示一次......

主要思想是将GCode发送到服务器,一旦有人需要该文件,如果它没有呈现,则呈现,并将SVG保存在数据库或文件中,并存储缓存,避免多次重新处理同一个文件。

将使用ajax检索SVG,并在页面上插入呈现(但我认为我将使用ajax加载所有内容)。

文件一旦发送到服务器,将永远不会被修改,但可以删除,并重新发送......

由于

3 个答案:

答案 0 :(得分:6)

<强>更新

对于你正在做的事情,我建议将SVG存储为一个单独的文件,然后将SVG作为图像返回(提示:PHP中的header("Content-type: image/svg+xml");)。

作为旁注,你说The SVG, would be retrieved with ajax, and also rendered with PHP on the page.这不太正确; SVG是一个文本/ XML文件。 PHP不呈现SVG,它只将SVG的代码发送给客户端。客户端计算机必须才能解析SVG代码并将其作为可见图像呈现给客户端。

原始答案

答案:取决于。你还没有给我们太多的帮助。

SVG是ASCII文本,有点像HTML。您可以了解更多here。因此,在JSON中发送SVG文件没有任何“错误”,只需确保转义任何引号。

JSON适用于大型结构;问题不在于它的大小,它是从服务器发送到客户端所需的时间,然后是javascript解析JSON并将SVG渲染为图像所花费的时间。我不知道你的设置是什么样的,或SVG文件有多大,但是对于非常大的SVG图像,你可能想把它们放在一个单独的请求中,它只返回SVG,所以客户端机器没有花时间解析JSON。您必须对您的应用程序进行性能测试,以查看最适合您需求的内容。

至于将SVG存储为文件或数据库,它取决于数据库,索引的内存量以及索引的构建方式,无论是SQL还是NoSQL,或者它有多少存储空间,您在网站上拥有多少流量,如何备份数据库和/或文件等等。人们使用数据库存储用户图像的缩略图,因此它绝对可以容纳SVG文件。这一切都取决于数据库的速度和稳定性。就个人而言,我更喜欢将图像和大量文本保存在硬盘上的单独文件中。

答案 1 :(得分:1)

这取决于(至少)两件事:

  1. 您打算如何使用数据(以后可以修改吗?)
  2. 网站将获得多少流量。
  3. 如果稍后可以修改SVG数据,我会将其保存在数据库中。那里的JSON数据应该很好。

    如果您认为自己会获得大量流量,那么除非您拥有良好的缓存机制,否则我个人不会将其保存在数据库中。我不确定你是否在使用MySQL,但MySQL中的查询缓存可能不会对缓存大量数据感到高兴。

    我个人会做的是将SVG保存在一个文件中,并以一种可以根据数据库中相关记录检索它的方式存储它,即/uploads/svg/$username/$circuitboardid.svg

    如果您拥有大量用户(30,000+),您的svg目录将会变得庞大,并且根据文件系统的不同,您可能会遇到文件夹/文件夹限制。

答案 2 :(得分:0)

我通过在php和mySQL数据库中使用以下代码段来完成此操作: 首先,记住svg基本上就像HTML一样存储在文本中。并且svg标签,都是不同的标签,与HTML标签非常相似。

存储到数据库中。您必须在实际的mySQL Insertcall中使用以下代码段。我发现如果你首先对变量执行此操作然后将变量放入insert调用中它将无法工作。该函数必须在mySQL语句中 mysql_real_escape_string($myValue)

在值中检索文本框。假设您的值已经从数据库中检索到,现在位于一个名为theValues的数组中。基本上我正在删除任何反斜杠,但在手之前,我确保它可以使用htmlentities正确显示。由于你在svg中没有反斜杠,我知道它修复了服务器用\“替换引号的地方。如果你在svg中遇到一些反斜杠,你只需要在你的替换功能中更聪明一点。
 $myValue= str_replace("\\", "", htmlentities($theValues->myValue)); echo $myValue;

回显一个页面与上面相同的原因,但是htmlentities函数使它只显示svg的文本而不是处理svg并显示你的图片。这只是在已经存储在数据库中的文本之后显示svg所必需的,但它不会伤害你的显示器如果它不是第一个数据,只是一个不必要的函数调用。
str_replace("\\", "",$myValue)