2017-01-17 5 views
0

버전 2012에는 새로운 기능인 FileTable이 있으므로 SQL Server를 알고 있습니다. 이를 통해 파일 시스템에 파일을 저장하고 T-SQL에서 사용할 수 있습니다.SQL Server의 FileTable에 저장된 파일에 액세스하는 방법?

이 기능을 사용하려고하는데 제대로 수행 할 방법이 없습니다.

일반적으로 파일 테이블에 저장된 파일에 액세스하는 방법을 알지 못합니다. asp.net MVC app을 가지고 있고 img 태그로 웹 페이지에 보여줄 이미지가 많이 있다고 가정 해 봅시다. 이러한 이미지를 Filetable에 저장하고 파일 시스템에서 파일로 액세스하려고합니다. 그러나 나는이 파일들이 어디에 저장되어 있는지, 파일로 어떻게 사용하는지 모른다. 이제 내 이미지는 폴더에있는 이미지에 웹 응용 프로그램 디렉토리에 저장 I는 다음과 같이 쓰고있다 :

<img src='/images/mypicture.png' /> 

을 그리고 난 테이블을 파일로 내 이미지를 이동하면 제가 SRC에 작성해야?

<img src='path-toimage-in-filetable' /> 

답변

0

FileTable은 실제로 FileStream을 의미한다고 가정합니다. 그것에 대해 몇 가지 참고 사항 : -이 규칙에 예외가있을 수 있지만, 그들이 경우 파일이 실제로

  • 이 파일은 평균적으로해야 1메가바이트보다 큰 파일 경우

    1. 이 기능은 최적의 사용 평균 1MB 미만인 경우 VARBINARY(MAX) 또는 XML 데이터 유형을 적절하게 사용하는 것이 더 나을 수 있습니다. 이미지가 평균적으로 매우 작 으면 (단 몇 KB 만) VARBINARY(MAX) 열을 사용하는 것이 좋습니다.
    2. 이러한 파일에 액세스하면 열려있는 트랜잭션을 필요로하고 데이터베이스가 제대로 FILESTREAM
    3. 구성되어 있는지 당신은 당신이 액세스하려는 SQL Server를 말함으로써 데이터 액세스의 정상적인 SQL 엔진/데이터베이스 파일 방법을 우회하는 몇 가지 중요한 이점을 얻을 수 있습니다 그러나 파일 시스템에서 파일에 직접 액세스하고이를 시도하는 것은 이러한 파일에 대한 SQL의 관리를 깨뜨릴 수 있습니다 (트랜잭션 일관성, 추적, 잠금 등).
    4. 실제로 여기에 SQL이 필요한 경우 CDN을 사용하고 이미지 URL을 테이블에 저장하면 유스 케이스가 더 잘 처리 될 가능성이 큽니다. 당신은 FILESTREAM 이것을 사용하여 (한 구현에 대해서는 아래의 코드 샘플을 참조하십시오.) 어쨌든 브라우저가 제대로 캐시 할 수있는 이미지를 저장하지 않는 한 모든 요청에 ​​대해 SQL 서버를 망치게 될 것입니다. (예를 들어 ' 그것을해라.) - 만약 브라우저에 렌더링을 위해 다른 곳에 저장했다면, 브라우저에 저장해 두는 것이 좋다. (다른 드라이브/디스크/디렉토리에 복사 한 후에는 이미지의 트랜잭션 일관성을 유지할 수 없다. 위치 어쨌든). 이 아닌이 같은 처리 할 이미지가 많이있는 경우,

      public static string connectionString = ...; // get your connection string from encrypted config 
      
      // assumes your FILESTREAM data column is called Img in a table called ImageTable 
      const string sql = @" 
          SELECT    
           Img.PathName(), 
           GET_FILESTREAM_TRANSACTION_CONTEXT() 
           FROM ImageTagble 
           WHERE ImageId = @id"; 
      
      public string RetreiveImage(int id) 
      { 
          string serverPath; 
          byte[] txnToken; 
          string base64ImageData = null; 
          using (var ts = new TransactionScope()) 
          { 
           using (var conn = new SqlConnection(connectionString)) 
           { 
            conn.Open(); 
            using (SqlCommand cmd = new SqlCommand(sql, conn)) 
            { 
             cmd.Parameters.Add("@id", SqlDbType.Int).Value = id; 
             using (SqlDataReader rdr = cmd.ExecuteReader()) 
             { 
              rdr.Read(); 
              serverPath = rdr.GetSqlString(0).Value; 
              txnToken = rdr.GetSqlBinary(1).Value; 
             } 
            } 
            using (var sfs = new SqlFileStream(serverPath, txnToken, FileAccess.Read)) 
            { 
            // sfs will now work basically like a FileStream. You can either copy it locally or return it as a base64 encoded string 
             using (var ms = new MemoryStream()) 
             { 
              sfs.CopyTo(ms); 
              base64ImageData = Convert.ToBase64String(ms.ToArray()); 
             } 
            } 
           } 
           ts.Complete(); 
           // assume this is PNG image data, replace PNG with JPG etc. as appropraite. Might store in table if it will vary... 
           return "data:img/png;base64," + base64ImageData; 
          } 
      } 
      

      분명히 : 말했다 모두와 함께

    , 여기 당신이 ADO.NET을 사용하여 FILESTREAM 데이터에 액세스 할 거라고하는 방법의 예 이상적인 방법 - CDN을 사용해야하는 대상으로 SQL Server의 인스턴스를 만들지 마십시오. 그러나 다른 좋은 이유가있는 경우에는 가능한 한 많은 이미지를 가져와야합니다. 단일 요청/트랜잭션 (예 : 한 페이지에 50 개의 이미지를 표시하는 경우 하나의 트랜잭션 범위로 50 개를 가져오고 50 개의 트랜잭션 범위를 사용하지 마십시오.이 코드는 처리하지 않습니다).

  • 0

    나는 아직도 당신이 이것을 필요로하지 않는다고 생각한다. 어쨌든 나는 관심있는 다른 누군가를 위해 나의 대답을 게시 할 것이다. 첫째, 파일 테이블이 여전히 테이블이므로, SQL 문에서 데이터에 액세스하려면 Select SQL 문을 사용해야합니다.

    select name, file_stream from filetable_name 
    where 
    name = 'file_name', 
    file_type = 'file_extension' 
    

    그냥 다음, 당신의 asp.net 응용 프로그램에서이 같은 문을 실행 결과를 가져오고 저장된 파일의 바이너리 데이터를 얻기 위해 file_stream 열을 사용 : 그래서 당신이 뭔가를해야 할 것입니다. 이 후

    public ActionResult GetFile(){ 
    .. 
    return File(file.file_stream,file.file_type); 
    } 
    

    , HTML 태그 뭔가처럼 넣어 :

    <img src="/controller/GetFile" /> 
    
    당신이 HTML에서 파일을 검색 할 경우, 먼저 검색된 파일을 반환하는, 컨트롤러에 액션을 작성해야

    희망이 도움이 될 수 있기를 바랍니다. 파일 테이블의 스키마를 알고 싶다면 here

    을 참조하십시오.