如何在磁盘上存储图像并使用EF链接到数据库?

时间:2011-02-18 11:43:42

标签: c# entity-framework

我有一张桌子

ID | ImagePath
-------------------
 1 | ~/files/1.png

我的模特课有

public Int64 ID { ... }
public string ImagePath { ... }

我正在尝试找到一种将图像存储在文件中的方法。我正在考虑创建byte[]属性,只在我调用SaveChanges时写入文件。

有可能吗?保存更改时是否会触发某些事件,我只能在这种情况下使用?

或者是否有更好的方法可以在数据库中存储 path并在磁盘上存储files

1 个答案:

答案 0 :(得分:1)

在我的一个项目中,我将文件存储在文件夹中,而FilePath存储在链接实体的数据库中(关系是1对1)。 我刚刚创建了带有byte []属性的文件实体和用于在服务器上保存文件的域服务。在InsertFile中,我调用了在磁盘上保存字节的文件处理程序。

public IQueryable<WebFile> GetFiles()
        {

            string path = "~/Upload";

            List<WebFile> webFiles = new List<WebFile>();

            if (string.IsNullOrEmpty(path)) return webFiles.AsQueryable();

            DirectoryInfo di = new DirectoryInfo(HttpContext.Current.Server.MapPath(path));

            foreach (FileInfo file in di.GetFiles())
            {

                webFiles.Add(new WebFile { FileName = file.Name });

            }

            return webFiles.AsQueryable();

        }

        public void InsertFile(WebFile file)
        {

            FileHandler.HandleFile(file);

        }

数据库中的链接只是文件名(因为有一个文件夹,没有理由存储完整路径)

FileHandler代码:

public class FileHandler
    {
        public static void HandleFile(WebFile file)
        {

            string uploadDir = "~/Upload";

            if (!string.IsNullOrEmpty(uploadDir))
            {

                if (uploadDir.IndexOf("~/") == 0)

                    uploadDir = HttpContext.Current.Server.MapPath(uploadDir);

                if (uploadDir.LastIndexOf("/") == uploadDir.Length - 1)

                    uploadDir = uploadDir.Substring(0, uploadDir.Length - 1);

                string fullFileName = string.Format("{0}/{1}", uploadDir, file.FileName);

                if (File.Exists(fullFileName))
                {

                    string ext = fullFileName.Substring(fullFileName.LastIndexOf("."));

                    string fName = fullFileName.Substring(0, fullFileName.LastIndexOf("."));

                    fullFileName = string.Format("{0}_1{1}", fName, ext);

                }

                File.WriteAllBytes(fullFileName, file.FileContent);

            }

        }
    }