对保存SVG文件和检索有疑问


Doubts about saving SVG files and retrieving

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

我现在面临一个问题,实际上是一个架构问题。

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

我应该以类似JSON的形式({name:test,data:SVGFILEGOESHERE})返回SVG,还是仅以.SVG的形式呈现?我的意思是,JSON对于BIG数据结构来说足够安全吗?

编辑:

转换后的SVG将用于网站中的许多视图,例如:产品页面、配置页面。。。它不会只出现一次。。。

其主要思想是向服务器发送一个GCode,一旦有人需要该文件,如果它没有被渲染,那么它就会渲染并将SVG保存在数据库或文件中,并存储缓存,以避免多次重新处理同一文件。

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

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

感谢

更新

对于您正在做的工作,我建议将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。你可以在这里了解更多。因此,用JSON发送SVG文件没有任何"错误",只需确保转义任何引号即可。

JSON适用于大型结构;问题不在于它的大小,而在于将其从服务器发送到客户端所需的时间,以及javascript解析JSON并将SVG呈现为图像所需的速度。我不知道你的设置是什么样的,也不知道SVG文件有多大,但对于非常大的SVG图像,你可能想把它们放在一个单独的请求中,只返回SVG,这样客户端机器就不会花时间解析JSON了。你必须对你的应用程序进行性能测试,看看什么最适合你的需求。

至于将SVG存储为文件或存储在数据库中,这取决于数据库,它有多少内存用于索引以及索引是如何构建的,是SQL还是NoSQL,或者它有多少存储空间,你在网站上有多少流量,你如何备份数据库和/或文件等。人们已经使用数据库来存储用户图像的缩略图,所以它肯定可以保存SVG文件。这完全取决于数据库的速度和稳定性。就我个人而言,我更喜欢将图像和大量文本保存在硬盘上的单独文件中。

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

  1. 您计划如何使用数据(以后可以修改吗?)
  2. 网站将接收多少流量

如果以后可以修改SVG数据,我会将其保存在数据库中。JSON数据在那里应该很好。

如果你认为你会得到很多流量,那么我个人不会将其保存在数据库中,除非你有良好的缓存机制。我不确定你是否在使用MySQL,但MySQL中的查询缓存可能对缓存大量数据不太满意。

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

如果你有很多用户(30000+),你的svg目录会变得很大,根据文件系统的不同,你可能会遇到每个文件夹的文件限制。

我通过在php和mySQL数据库中使用以下代码段实现了这一点:首先,请记住svg基本上是以文本形式存储的,就像HTML也是一样。svg标签,无论是不同的标签,都与HTML标签非常相似。

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

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

回显到页面上的原因与上述相同,但htmlentities函数使其仅显示svg的文本,而不是处理svg并显示您的图片。这只需要在Has的文本存储在数据库中后显示svg,但这不会影响您的显示。如果不是第一个数据,只是一个不必要的函数调用
str_replace("''", "",$myValue)