【问题标题】:ASP.NET Image Upload ArchitectureASP.NET 图像上传架构
【发布时间】:2010-11-17 19:35:17
【问题描述】:

实现以下场景的最佳方法是什么: 该网站需要一个图像库,其中包含要存储的私有图像和公共图像。我听说您可以将它们存储在文件层次结构或数据库中。在文件层次结构设置中,如何防止直接访问图像。在数据库设置中,只能通过网页视图访问图像。什么是有效的解决方案?

[编辑] 感谢大家的回复。我决定数据库路由是这个应用程序的最佳选择,因为我没有直接访问服务器的权限。仅限于 webroot 文件夹。非常感谢所有回复。

【问题讨论】:

    标签: asp.net database image-processing upload


    【解决方案1】:

    使用了这两种方法后,我会说使用数据库。如果您将它们存储在文件存储中并且它们需要保护,那么您必须将它们存储在 web-root 之外,然后使用处理程序(如 John 提到的)来检索它们,无论如何。编写一个处理程序以直接从数据库流式传输它们同样容易,并且您可以获得一些优势:

    • 使用数据库,您无需担心文件存储权限或生成唯一文件名或文件夹层次结构等问题。
    • 使用数据库,您可以轻松地直接应用权限和保护 - 无需尝试根据路径等确定谁可以查看哪些内容。
    • 使用数据库,您可以将图像和元数据一起存储 - 当您删除元数据时,您会删除图像 - 您从数据库中删除但不是从文件存储中删除的孤立记录是不可能的
    • 更容易备份数据库和图像,然后恢复

    缺点是性能,但您可以使用缓存等来帮助解决这个问题。您还可以使用FILESTREAM storeage in SQL Server 2008(和 05?),这意味着您可以通过 DB 获得文件系统性能:

    "FILESTREAM 集成了 SQL Server 带有 NTFS 文件的数据库引擎 系统通过存储 varbinary(max) 二进制大对象 (BLOB) 数据为 文件系统上的文件。事务处理 SQL 语句可以插入、更新、查询、 搜索和备份 FILESTREAM 数据。 Win32文件系统接口提供 流式访问数据。

    FILESTREAM 使用 NT 系统缓存 用于缓存文件数据。这有助于 减少 FILESTREAM 数据的任何影响 可能在数据库引擎上 表现。 SQL Server 缓冲区 未使用池;因此,这 内存可供查询 处理。”

    【讨论】:

      【解决方案2】:

      使用文件层次,可以把文件放到网站文件夹之外,比如假设web文件夹是c:/inetpub/wwwroot/somesite,把文件放到c:/images/下,这样web用户将无法访问图像文件。但是您也不能在您的网站中使用直接链接,您需要创建一些程序来读取文件,返回流。

      我个人认为最好将文件放入数据库中,仍然创建一些程序来检索二进制图像数据并返回到需要的地方。

      【讨论】:

      • 我打算对此评论投赞成票,直到您表示您认为最好将文件放入数据库中:-\ 如果您在数据库中存储了大量图像,这可能会导致严重性能问题。
      • 我了解存在限制。但根据我自己的经验,sql server 处理得很好...... :-)
      • 安德鲁,请参阅我的评论:FILESTREAM 存储 - 解决了性能问题
      【解决方案3】:

      实际上,这两种情况都非常相似,所以这取决于你...它。

      要回答有关直接访问的问题,您需要像设置数据库一样设置文件图像:您需要使用某种页面(可能是 .ashx 处理程序)来提供图像,从而允许您用户和图像之间的逻辑层,以确定他们是否应该有权访问它。图像所在的实际目录将需要 a) 不是 IIS 中目录结构的一部分,或者 b) 如果它是 IIS 的一部分,则只允许 Windows 身份验证访问,并且只允许运行应用程序进程的帐户在访问目录下。

      【讨论】:

      • 如果您处于负载平衡环境中,您可能希望将服务器指定为资源服务器,或者在服务器之间创建某种复制机制。
      【解决方案4】:

      如果您使用的是 IIS7,由于 .net 很早就加入了管道,我相信您也可以保护 jpg 文件,只需使用角色管理器并将角色应用于文件系统文件夹即可。如果您使用的是 IIS6,我已经完成了与 John 的回答类似的操作,我将实际文件存储在 wwwroot 之外,并使用处理程序来决定用户是否拥有正确的凭据来查看图像。

      除非您有充分的理由这样做,否则我会避免使用数据库 - 我不认为照片库是其中之一。

      【讨论】:

        【解决方案5】:

        两者都没有。 Amazon S3 提供了一个非常简单的 API 来接受上传。您可以使用 SimpleDB 或您的 SQL 数据库来跟踪 URL 和权限。将整个 S3 存储桶设置为私有,并使用您在 ASP.NET 服务器上的 AWS 密钥对其进行身份验证。

        上传到 S3 只需要很少的代码,在 SQL 中执行簿记只需要很少的代码。

        一旦它们进入 S3,抓住 image resizer libraryS3 Reader plugin,您可以在一小时内运行整个系统。并且 - 它会正确扩展。没有磁盘或数据库空间限制。永远。

        您可以使用 Image Resizer 库的 AuthorizeImage 事件来实现授权。如果当前用户不允许访问,只需抛出 AccessDeniedException。

        如果您想稍微调整一下性能,请添加 DiskCache 和 CloudFront 插件。 CloudFront 可以边缘缓存公共图像(成本低廉),而 DiskCache 将处理私有图像,以静态文件速度提供服务。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-20
          • 2018-08-17
          • 2012-05-11
          • 2010-11-25
          • 2011-01-10
          • 1970-01-01
          • 2020-12-19
          • 2010-10-06
          相关资源
          最近更新 更多