9

我的网站有一个管理部分,“作者”可以在其中上传照片画廊的图片等文件,以便稍后包含在我网站的动态内容部分中。我有某些页面,其中 html 本身存储在我的 mySQL 数据库中,用户可以使用 ckeditor界面编辑内容。

我正在尝试查看是否可以利用某些东西将文件保存到正确的目录并稍后检索它们,或者我应该从头开始编写所有这些。此外,寻找经验教训和要小心的事情(安全等。)

4

4 回答 4

11

我会试一试。我们拥有的一个应用程序做了类似的事情,我们做了“自己做的事情”。用户可以通过我们的应用程序界面上传文件(图像、文档等),这些文件确实具有用户/公司/角色敏感权限。为了减轻一些安全问题和其他一些原因,我们实施了以下内容。

  1. 在 Web 应用程序中,我们创建了一个“资产”文件夹,用于存储所有用户生成的内容。然后,我们使用子文件夹来帮助分割内容(徽标、文件等)。

  2. 在 web.config 中,我们将这个文件夹配置为无法从浏览器访问(就像 App_Data 或 bin 文件夹一样),使用以下几行(我们这样做是为了确保这些文件都不能直接从浏览器访问。请参阅更多关于第 4 点):

     <system.webServer>
    <security>
      <requestFiltering>
        <hiddenSegments>
          <add segment="Assets"/>
        </hiddenSegments>
      </requestFiltering>
    </security>
    

  3. 上传文件后,我们会将有关文件的相关信息(类型、大小、名称、评论)存储在数据库中。这也使我们能够关联文件上的角色和用户安全信息。

  4. 为了检索文件,我们实现了一个带有一组操作的控制器,该控制器获取请求的文件名和用户信息(因为您必须登录)并从 Assets 文件夹中返回文件。对于最终用户来说,看起来所有文件都存储在 /Files/Docs/FileID 或类似的东西中,但实际上这只是文件本身的前端“看门人”。如果您未经授权或请求错误文件,此控制器/操作方法将返回 404。对于文件命名,我们只生成 GUID 并将文件命名为“GUID.relevantExtension”(检查一个不存在)

我想对于吸取的教训或诸如此类的东西,最重要的是您不要直接公开文件,尤其是在用户不共享内容的情况下。此外,这可能是个人喜好,如果不小心可能会引发一场战争,我不太喜欢在数据库中存储文件,因为它似乎会导致分页和缓存性能问题(也不是在谈论 SQL 2008 文件列)。希望这可以帮助!

编辑- 关于这样做的另一个想法,在从 VS 发布时要注意。这些上传的文件不是您的解决方案的一部分,如果您执行删除上传类型的发布,您将为您的用户文件打蜡。只是提醒一下(去过那里:/)

于 2011-09-26T19:41:11.723 回答
0

我想你最终会得到“从头开始写这一切”。

对我来说,我有“文件”文件夹,然后我为每个用户创建子文件夹,如果我在这个 UserFolder 子文件夹中为每种类型的数据创建了很多类型。

在我的数据库中,我只存储“路径”来获取这些文件。

于 2011-08-27T21:05:11.600 回答
0

如果您创建一个 enctype 为 multipart/form-data 的表单,那么您可以在控制器中接收一个 HttpPostedFileBase。

在视图中:

<form action="/MyController/MyAction/" method="post" enctype="multipart/form-data">

在控制器中:

public ActionResult MyAction(HttpPostedFileBase httpPostedFileBase) { // Your code here. }

httpPostedFileBase 参数将被默认模型绑定器映射。

于 2011-09-21T17:05:10.003 回答
0

可在此处获得此类 CMS 网站的图像大小调整库

于 2011-09-29T04:51:59.460 回答