将用户文件上传到服务器的 MVC 应用程序

MVC Application that uploads a user's file to the server

我一直在努力做到这一点,并且需要有关读取用户计算机上的客户端文件的 MVC 应用程序的最佳实践的建议。我的应用程序需要将 excel 文件上传到 Web 服务器,然后对该文件执行一些验证,我一直在努力让它工作,我知道从用户机器读取文件存在安全风险,但还有什么办法我可以执行此任务吗,因为用户需要上传文件以便应用程序可以处理它。我试图将文件保存到服务器,但我遇到无数异常,要么找不到文件或文件的一部分,要么文件用户无法在 IE 和 Chrome 中访问文件,我已经测试过我的本地机器和一切似乎都工作正常,我唯一的问题是我将它部署到服务器。我已尝试 运行 特定用户下的应用程序,并授予该用户访问我将文件保存到 Web 服务器上的应用程序文件夹的权限,但仍然无法正常工作,我已尝试使用 ApplicationPoolIdentity 但仍未成功正确的。在 Windows Server 2012 R2 上的 IIS8 中托管的 MVC 应用程序中执行此类任务的最佳方法和推荐方法是什么。请在下面查看我尝试保存文件的方法,但一旦部署它们就无法正常工作。

方法 1 - 这里我尝试使用 Server.Map

public ActionResult Upload(HttpPostedFileBase file)
    {

        List<CleanSupplierClaim> supplierClaimsData = new List<CleanSupplierClaim>();

        try
        {
            if (file.ContentLength > 0)
            {

                var fileName = Path.GetFileName(file.FileName);
                var targetPath = Server.MapPath(@"~/upload");

                file.SaveAs(Path.Combine(targetPath, fileName));

方法 2 - 这里我尝试保存到其托管的应用程序目录。

List<CleanSupplierClaim> supplierClaimsData = new List<CleanSupplierClaim>();

        try
        {
            if (file.ContentLength > 0)
            {

                var fileName = Path.GetFileName(file.FileName);


                var targetPath = @"\servername\C$\inetpub\wwwroot\GpVisibilityUploadQA\upload\" + fileName;
                file.SaveAs(targetPath);

执行此操作的最佳方法是什么。我真的卡住了。请帮忙

这是快速上传框的 Razor 语法(假设是 Home 控制器)

    @using (Html.BeginForm("Upload",
                                    "Home",
                                    FormMethod.Post,
                                    new { enctype = "multipart/form-data" }))
{
    <label for="file">Upload File:</label>
    <input type="file" name="file" id="file" /><br><br>
    <input type="submit" value="Upload File" />
    <br><br>
}

这是获取该文件的 byte[] 的控制器方法

[HttpPost]
public ActionResult Upload(HttpPostedFileBase file)
{
    BinaryReader b = new BinaryReader(file.InputStream);
    byte[] binData = b.ReadBytes((int)file.InputStream.Length);
}

一旦你有了字节[],你就可以将它写入服务器上的临时文件并执行你想要的任何validation/manipulations