1

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

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

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

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

编辑:

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

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

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

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

谢谢

4

3 回答 3

6

更新

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

作为旁注,您说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 文件。这完全取决于数据库的速度和稳定性。就个人而言,我更喜欢将图像和大量文本保存在硬盘上的单独文件中。

于 2012-08-04T23:59:48.077 回答
1

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

  1. 您打算如何使用这些数据(以后可以修改吗?)
  2. 网站将获得多少流量。

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

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

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

如果您有很多用户(超过 30,000 个),您的 svg 目录会变得很大,并且取决于文件系统,您可能会遇到每个文件夹的文件数限制。

于 2012-08-04T23:57:23.273 回答
0

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

存入数据库。您必须在实际的 mySQL Insertcall 中使用以下代码段。我发现如果你先对变量执行此操作,然后将变量放入插入调用中,它将不起作用。该函数必须在 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)

于 2013-11-27T16:31:36.217 回答