Можно ли преобразовать gltf в массив байтов, а затем преобразовать массив обратно в файл?

Я пытаюсь сохранить файл GLTF в postgreSQL. Мне пришла в голову идея преобразовать файл в массив байтов с помощью потока памяти. Но когда я пытаюсь преобразовать его обратно из массива байтов в файл с помощью System.IO.File.WriteAllBytes, я получаю поврежденный файл.

Можно ли преобразовать gltf в байты, а затем обратно?

Я пытался использовать пакеты типа SharpGLTF, но это не помогает.

Я бы предложил прочитать файл, закодировать его в Base64, а затем сохранить в базе данных в виде текста. Читайте в обратном порядке.

Stefanov.sm 21.04.2024 19:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
77
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Основной подход к сохранению или извлечению файла из базы данных:

Считайте необработанный файл в массив byte[].

Сохраните этот массив byte[] в базе данных.

И получить файл?

Затем получите/загрузите/запросите строку базы данных.

Преобразуйте двоичный столбец в массив byte[].

Сохраните/запишите массив байтов в файл.

Итак, код сохранения файла в базу данных будет выглядеть так:

(Я использую SQL-сервер, а не 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();
            }
        }
    }

Конечно, но опять же опубликованный код будет работать с файлами любого типа, и поэтому для приведенного выше кода не существует никаких ограничений. Здесь существуют незначительные преимущества, но, конечно, использование строки вместо массива byte[] по-прежнему является хорошим предложением с вашей стороны.

Albert D. Kallal 22.04.2024 00:56
Ответ принят как подходящий

Проблема была в том, что GLTF2.0 — это закодированный тип файла. Преобразование его в массив приводит к сбою его содержимого. Единственное решение, которое я нашел, — это использование форматов .obj или .fbx.

Другие вопросы по теме