在Web应用程序中存储文件上传的位置在哪里?

3

我正在使用一个 byte[] 来获取我想要上传到 ASP.NET 网站的文件的序列化版本。我在你的视图模型上使用 HttpPostedFileBase 来保存上传的文件。

public class MyViewModel
{
    [Required]
    public HttpPostedFileBase File { get; set; }
}

我的 HomeController

public class HomeController: Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel();
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        if (!ModelState.IsValid)
            return View(model);

        byte[] uploadedFile = new byte[model.File.InputStream.Length];
        model.File.InputStream.Read(uploadedFile, 0, uploadedFile.Length);

        // Where do I write the file to?

        return Content("Upload complete");
    }
}

最后我认为,我已经达到了……(需要上下文才能确定具体翻译)
@model MyViewModel
@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <div>
        @Html.LabelFor(x => x.File)
        @Html.TextBoxFor(x => x.File, new { type = "file" })
        @Html.ValidationMessageFor(x => x.File)
    </div>
    <button type="submit">Upload</button>
}

上传操作只会由我(管理员)执行,而且只有两个文件需要上传,都是应用程序安装程序(.exe文件,一个8MB和另一个18MB)。我的问题是,我该如何/在哪里存储已上传的文件,以便用户可以下载这些文件?

感谢您的时间。


1
从技术上讲,在大多数情况下,将上传的文件存储在网站根目录之外,并通过处理程序进行访问总是更好的选择。这种方法的好处不仅在于安全性,还可以在文件下载时执行其他任务(如日志记录等),甚至可以在更改文件路径后保持永久链接的能力... - Laurent S.
感谢您的时间。我认为将原始数据存储在数据库中不是正确的方法?此外,使用这个作为您的头像将会很棒! - MoonKnight
1
将其存储在数据库中也是一种可能性,确实提供了与通过处理程序访问它所需的相同优点。但是,与文件存储相比,DB存储通常更昂贵,因此您可能希望保持存储数据的大小相当低。话虽如此,这两种解决方案的最大优势是您可以决定随时切换到任何其他解决方案,更新处理程序将使更改对用户透明... - Laurent S.
1个回答

1
通常您会使用App_Data文件夹来完成这个任务。这可以通过HttpContext.Current.Server.MapPath("~/App_Data/");访问。
然而,有上传的担忧会将数据存储在Web应用程序的子文件夹中(这可能会因vNext的设计而减轻)。如今,像这样的任何东西(用户可能想要通过互联网访问)我都会存储在一些类似于Azure StorageS3的地方,虽然它们需要一些成本,但在大多数情况下,这些成本是如此之低以至于不会成为问题(每月每GB约$0.0300)。

感谢您的时间。在您回答之前,我正在创建一个“DownloadsDbContext:DbContext”,其中将文件存储为“byte”数组。从您的答案中可以推断出,这是一个不好的想法?很抱歉问题水平较低,我非常新手网站开发,没有人可以问。找到简单设计问题的答案非常困难... - MoonKnight
你可以这样做,这个想法并不是很糟糕,但我通常不会这样做。传统数据库不是存储文件的好地方,请参见http://programmers.stackexchange.com/questions/150669/is-it-a-bad-practice-to-store-large-files-10-mb-in-a-database。数据库存储的成本通常比文件存储更昂贵。现代数据库提供了混合文件/表存储的能力,如SQL服务器的FileTables - 但这可能对你所看到的内容来说过于复杂了。 - AlexC
谢谢。是的,我只需要为我们的用户提供下载最多四个不同的安装包(从8MB到约18MB)。所以你是说我可以使用HttpContext.Current.Server.MapPath("~/App_Data/");获取服务器映射路径,但你能否提供更多关于如何将我的byte数组写入此位置的信息?再次感谢您的时间... - MoonKnight
尝试使用HttpPostedFileBase.SaveAs方法的model.File.SaveAs(path)。http://msdn.microsoft.com/en-us/library/system.web.httppostedfilebase.saveas(v=vs.110).aspx - AlexC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接