是否可以将gltf转换为字节数组,然后将字节数组转换回文件?

问题描述 投票:0回答:2

我正在尝试将 GLTF 文件存储在 postgreSQL 中。我想出了一个想法,用内存流将文件转换为字节数组。但是当我尝试使用 System.IO.File.WriteAllBytes 将其从字节数组转换回来时,我得到了损坏的文件。

是否可以将 gltf 转换为字节然后再转换回来?

我尝试使用像 SharpGLTF 这样的软件包,但它没有帮助。

c# asp.net postgresql gltf
2个回答
0
投票

从数据库保存或检索文件的基本方法是:

将原始文件读入 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();
            }
        }
    }

0
投票

问题在于 GLTF2.0 是编码类型的文件。将其转换为数组会导致其内容崩溃。我找到的唯一解决方案是使用 .obj 或 .fbx 格式。

© www.soinside.com 2019 - 2024. All rights reserved.