我正在尝试将 GLTF 文件存储在 postgreSQL 中。我想出了一个想法,用内存流将文件转换为字节数组。但是当我尝试使用 System.IO.File.WriteAllBytes 将其从字节数组转换回来时,我得到了损坏的文件。
是否可以将 gltf 转换为字节然后再转换回来?
我尝试使用像 SharpGLTF 这样的软件包,但它没有帮助。
从数据库保存或检索文件的基本方法是:
将原始文件读入 byte[] 数组。
将该 byte[] 数组保存到数据库中。
并检索文件?
然后获取/加载/查询数据库行。
将二进制列转换为 byte[] 数组。
将字节数组保存/写入文件。
因此,将文件保存到数据库的代码将如下所示:
(我使用的是 SQL Server,而不是 PostgreSQL,但使用 PostgreSQL .net 数据库提供程序的代码应该几乎相同)。
因此,要将文件保存到数据库,则:
string sFile = Server.MapPath($@"~/UpLoadFiles/control.pdf");
byte[] FileAsBytes = File.ReadAllBytes(sFile);
string sFileNameOnly = Path.GetFileName(sFile);
string strSQL =
@"INSERT INTO tblFiles (FileName, UpLoaded, MineType, FileB)
VALUES (@FileName, @UpLoaded, @MineType, @FileB)";
SqlCommand cmdSQL = new SqlCommand(strSQL);
cmdSQL.Parameters.Add("@FileName", SqlDbType.NVarChar).Value = sFileNameOnly;
cmdSQL.Parameters.Add("@UpLoaded", SqlDbType.DateTime).Value = DateTime.Now;
cmdSQL.Parameters.Add("@MineType", SqlDbType.NVarChar).Value =
MimeMapping.GetMimeMapping(sFile);
cmdSQL.Parameters.Add("@FileB", SqlDbType.Binary).Value = FileAsBytes;
General.MyRstE(cmdSQL);
要执行相反的操作,从数据库获取文件,然后是这样的:
int PK = 3; // for testing database PK row id
SqlCommand cmdSQL = new SqlCommand("SELECT * FROM tblFiles WHERE ID = @ID");
cmdSQL.Parameters.Add("@ID", SqlDbType.Int).Value = PK;
DataTable dt = General.MyRstP(cmdSQL);
string strFile = dt.Rows[0]["FileName"].ToString();
byte[] FileAsBytes = dt.Rows[0]["FileB"] as byte[];
File.WriteAllBytes(strFile, FileAsBytes);
我不知道PostgreSQL中有哪些列类型,但是应该存在二进制或blob类型的列,并且使用这样的列类型应该允许上述将文件转换为byte[]数组的过程,然后发送到数据库。
如上所示,当想要从数据库获取有效文件时,您可以反转该过程。因此,获取所需的行,将 blob/二进制列转换为字节数组,然后将该字节数组保存到文件中。
由于我们使用字节数组,因此文件类型是文本、pdf、.dll 或任何类型都没关系。
我在上面使用了一些方便的帮助例程,因为我不想一遍又一遍地键入创建数据库连接对象和命令对象。
因此,上面我的全局静态类中使用的辅助例程是:
public static DataTable MyRst(string strSQL)
{
DataTable rstData = new DataTable();
using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
{
using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
{
cmdSQL.Connection.Open();
rstData.Load(cmdSQL.ExecuteReader());
}
}
return rstData;
}
public static DataTable MyRstP(SqlCommand cmdSQL)
{
DataTable rstData = new DataTable();
using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
{
using (cmdSQL)
{
cmdSQL.Connection = conn;
conn.Open();
rstData.Load(cmdSQL.ExecuteReader());
}
}
return rstData;
}
public static void MyRstE(SqlCommand cmdSQL)
{
using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
{
using (cmdSQL)
{
cmdSQL.Connection = conn;
conn.Open();
cmdSQL.ExecuteNonQuery();
}
}
}
问题在于 GLTF2.0 是编码类型的文件。将其转换为数组会导致其内容崩溃。我找到的唯一解决方案是使用 .obj 或 .fbx 格式。