web-dev-qa-db-ja.com

エンティティフレームワークを使用してデータベースにファイルを保存する

Microsoft SQL Server2008を使用してEntityFramework上に構築されたASP.NETMVCソリューションがあります。ユーザーがファイルをアップロードできるようにする関数を作成する必要があります。

私が欲しいのは:

  • EntityFrameworkを使用してファイルをデータベースに保存するソリューション
  • ある種のハッシュ/チェックサムを介して同じファイルを2回検出し、アップロードしないようにするソリューション
  • データベース/テーブル設計のヒント
17
Freddy

SQL Server 2008データベースにファイルを格納する「正しい」方法は、 FILESTREAMデータ型を使用 です。 Entity Frameworkがそれをサポートしていることはわかりませんが、実際に何が起こるか試してみることができます。

とは言うものの、人々がこれを行うほとんどの場合、彼らはファイルをデータベースに保存しません。そうすることは、Webサーバーから直接提供できるファイルを提供するためだけにASP.NETとデータベースサーバーを経由する必要があることを意味します。また、データベースとサイトのバックアップ画像が多少複雑になる可能性もあります。そのため、MVC/Entity Frameworkにファイルをアップロードするときは、ファイルの場所への参照のみをデータベースに保存し、ファイル自体を別の場所に保存します。

明らかに、どの戦略があなたに適しているかは、アプリケーションの詳細に大きく依存します。

10
Craig Stuntz

エンティティモデルで、BLOBデータベース列をbyte[]プロパティにマップします。アップロードされたファイルのコンテンツをエンティティオブジェクトのそのプロパティに割り当て、変更をObjectContextに保存します。

ハッシュを計算するには、 MD5CryptoServiceProvider クラスを使用できます

44
Thomas Levesque

これが私がポッドキャストのためにそれをする方法です:

 
 IDタイトルパスの概要UploadDate 
 --- ----- -------- -------------- ------------ 
 1 TestPodcast/Podcasts/ep1.mp3テストポッドキャスト2010-02-12 
 

pathは、ポッドキャストの物理的な場所への参照を格納します。私はScottHanselmanからの投稿を使用して ASP.NET MVCを使用したファイルアップロード ファイルアップロード部分を処理しました。

5
George Stocker

@Thomasの回答に基づく実用的な例(これはGoogleで最初に来るため、ファイルのアップロードのみ):

public void AddDocument(HttpPostedFileBase file)
        {
            try
            {                
                    using (TransactionScope scope = new TransactionScope())
                    {
                        try
                        {
                            using (var ctx = new Entities())
                            {

                            EntityDoc doc = new EntityDoc(); //The document table 

                            doc.DocumentFileName = file.FileName; //The file Name

                            using (var reader = new System.IO.BinaryReader(file.InputStream))
                            {
                                doc.DocumentFile = reader.ReadBytes(file.ContentLength); // the Byte [] Field
                            }
                            ctx.EntityDocs.Add(doc);


                                ctx.SaveChanges();
                                scope.Complete();
                            }
                        }
                        catch (Exception ex)
                        {                          
                            throw ex;
                        }
                    }

            }
            catch (Exception ex)
            {

                throw ex;
            }
        }
0