> 백엔드 개발 > C++ > 파일을 데이터베이스에 바이트 배열로 저장하는 것이 다양한 파일 유형에 대한 최적의 접근 방식입니까?

파일을 데이터베이스에 바이트 배열로 저장하는 것이 다양한 파일 유형에 대한 최적의 접근 방식입니까?

Barbara Streisand
풀어 주다: 2025-01-15 11:31:44
원래의
111명이 탐색했습니다.

Is Storing Files as Byte Arrays in a Database the Optimal Approach for Diverse File Types?

데이터베이스 파일을 저장하는 가장 좋은 방법: 파일을 바이트 배열로 변환하시겠습니까?

질문:

모든 파일 형식을 바이트 배열로 변환하는 것이 데이터베이스 또는 디스크 스토리지에 가장 적합한 솔루션입니까? 특히 GIF, DOC 또는 PDF와 같은 여러 파일 형식을 처리할 때 이 접근 방식이 가장 적합합니까?

정답:

대상 데이터베이스가 SQL Server라고 가정하면 이 솔루션은 SQL Server 2005 및 2008을 효과적으로 처리할 수 있습니다. 다음 단계에서는 프로세스를 간략하게 설명합니다.

  1. 데이터베이스 테이블 생성: 바이너리 데이터를 저장하기 위해 VARBINARY(MAX) 열이 있는 테이블을 만듭니다. 이 예에서는 "RaportPlik"이라는 VARBINARY(MAX) 유형 열을 포함하는 "Raporty"라는 테이블을 만듭니다.

  2. 데이터베이스에 파일을 저장하는 방법:

    <code class="language-csharp">public static void databaseFilePut(string varFilePath) {
        byte[] file;
        using (var stream = new FileStream(varFilePath, FileMode.Open, FileAccess.Read)) {
            using (var reader = new BinaryReader(stream)) {
                file = reader.ReadBytes((int) stream.Length);       
            }          
        }
        using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
        using (var sqlWrite = new SqlCommand("INSERT INTO Raporty (RaportPlik) Values(@File)", varConnection)) {
            sqlWrite.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file;
            sqlWrite.ExecuteNonQuery();
        }
    }</code>
    로그인 후 복사
  3. 데이터베이스에서 파일을 검색하고 저장하는 방법:

    <code class="language-csharp">public static void databaseFileRead(string varID, string varPathToNewLocation) {
        using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
        using (var sqlQuery = new SqlCommand(@"SELECT [RaportPlik] FROM [dbo].[Raporty] WHERE [RaportID] = @varID", varConnection)) {
            sqlQuery.Parameters.AddWithValue("@varID", varID);
            using (var sqlQueryResult = sqlQuery.ExecuteReader())
                if (sqlQueryResult != null) {
                    sqlQueryResult.Read();
                    var blob = new Byte[(sqlQueryResult.GetBytes(0, 0, null, 0, int.MaxValue))];
                    sqlQueryResult.GetBytes(0, 0, blob, 0, blob.Length);
                    using (var fs = new FileStream(varPathToNewLocation, FileMode.Create, FileAccess.Write)) 
                        fs.Write(blob, 0, blob.Length);
                }
        }
    }</code>
    로그인 후 복사
  4. MemoryStream으로 파일을 검색하는 방법:

    <code class="language-csharp">public static MemoryStream databaseFileRead(string varID) {
        MemoryStream memoryStream = new MemoryStream();
        using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
        using (var sqlQuery = new SqlCommand(@"SELECT [RaportPlik] FROM [dbo].[Raporty] WHERE [RaportID] = @varID", varConnection)) {
            sqlQuery.Parameters.AddWithValue("@varID", varID);
            using (var sqlQueryResult = sqlQuery.ExecuteReader())
                if (sqlQueryResult != null) {
                    sqlQueryResult.Read();
                    var blob = new Byte[(sqlQueryResult.GetBytes(0, 0, null, 0, int.MaxValue))];
                    sqlQueryResult.GetBytes(0, 0, blob, 0, blob.Length);
                    memoryStream.Write(blob, 0, blob.Length);
                }
        }
        return memoryStream;
    }</code>
    로그인 후 복사
  5. MemoryStream을 데이터베이스에 저장하는 방법:

    <code class="language-csharp">public static int databaseFilePut(MemoryStream fileToPut) {
        int varID = 0;
        byte[] file = fileToPut.ToArray();
        const string preparedCommand = @"
                    INSERT INTO [dbo].[Raporty]
                                ([RaportPlik])
                          VALUES
                                (@File)
                      SELECT [RaportID] FROM [dbo].[Raporty]
          WHERE [RaportID] = SCOPE_IDENTITY()
                    ";
        using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
        using (var sqlWrite = new SqlCommand(preparedCommand, varConnection)) {
            sqlWrite.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file;
    
            using (var sqlWriteQuery = sqlWrite.ExecuteReader())
                while (sqlWriteQuery != null && sqlWriteQuery.Read()) {
                    varID = sqlWriteQuery["RaportID"] is int ? (int) sqlWriteQuery["RaportID"] : 0;
                }
        }
        return varID;
    }</code>
    로그인 후 복사

이러한 방법을 사용하면 SQL Server 데이터베이스에 다양한 형식의 파일을 효율적으로 저장하고 검색할 수 있습니다. 이 방법은 이진 데이터 관리를 위한 간단하고 안정적인 솔루션을 제공합니다.

위 내용은 파일을 데이터베이스에 바이트 배열로 저장하는 것이 다양한 파일 유형에 대한 최적의 접근 방식입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿