2017-01-17 211 views
0

バージョン2012以降の新機能は、FileTableです。これにより、ファイルシステムにファイルを格納し、T-SQLから使用することができます。SQL ServerのFileTableに格納されているファイルにアクセスするには?

この機能を使用しようとしていますが、正しく機能させる方法がわかりません。

一般に、ファイルテーブルに格納されているファイルにアクセスする方法はわかりません。 asp.net MVCアプリを持っていて、imgタグでWebページに表示する画像がたくさんあるとしましょう。これらのイメージをFiletableに保存し、ファイルシステムからファイルとしてアクセスしたいと思います。しかし、私はこれらのファイルがどこに保存されているのか、ファイルとしてどのように使用するのかはわかりません。今、私のイメージは、フォルダの画像で、Webアプリケーションのディレクトリに格納されていると私はこのような何か書きされています

<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エンジン/データベースファイルのメソッドをバイパスし、いくつかの重要な利点を得ることができますしかし、ファイルシステム上のファイルに直接アクセスすることを目的としたものではありません。そのため、これらのファイルの管理(トランザクションの整合性、追跡、ロックなど)が損なわれる可能性があります。
    4. 実際にこのためにSQLが必要な場合は、CDNを使用してイメージURLをテーブルに格納することで、ここのユースケースがより効果的になる可能性があります。あなたはFILESTREAMにしてください(1つの実装については下記のコードサンプルを参照してください)。ただし、ブラウザが適切にキャッシュすることができるイメージをどこにでも保存しない限り、あなたがブラウザにレンダリングするためにどこか他の場所に保存しておくと、そこに保存することもできます(他のドライブ/ディスク/ドライブにコピーした後は、場所はとにかく)。これではありませんあなたはこのように処理するための画像をたくさん持っている場合、

      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サーバーのインスタンスを作成しようとしないでください....しかし、他の本当に良い理由がある場合は、できるだけ多くの画像を取得しようとする必要があります単一のリクエスト/トランザクション(例えば、ページに50のイメージを表示していることがわかっている場合は、単一のトランザクションスコープで50を取得し、50のトランザクションスコープは使用しないでください。

  • 0

    私はあなたがまだこれを必要とは思わない、とにかく私は興味がある他の誰のために私の答えを投稿します。 まず、テーブルであるファイルテーブルがあるため、そこからデータにアクセスするにはSelect SQLステートメントを使用する必要があります。結果だけを取得し、保存されたファイルのバイナリデータを取得するためにfile_stream列を使用し、その後、あなたのasp.netアプリでこのような文を実行

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

    :だからあなたのようなものが必要だろう。

    <img src="/controller/GetFile" /> 
    
    :あなたの中のようなHTMLタグに何かを入れて、この後

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

    :あなたがHTMLからファイルを取得したい場合は、まずあなたが検索したファイルを返します。これは、あなたのコントローラでアクションを作成する必要があります

    これが助けてくれることを願っています! ファイルテーブルのスキーマを知りたい場合は here

    を参照してください。
    関連する問題