为什么显示“无法访问已关闭文件”错误?为什么只在服务器上呢?

时间:2012-07-26 10:54:42

标签: asp.net-mvc-3 file-upload

我有一个上传图片的代码段。上传时,它会暂时将文件存储在会话中。然后单击“保存”,它将文件保存在数据库中。

我的机器上没有问题,但在服务器上,每当我尝试上传某些文件,然后单击“保存”时,它会显示错误“无法访问已关闭的文件”。在谷歌搜索它,我读到here这是由于上传大文件。我想确认一下,我上传大文件的问题是什么?或者它可能是别的吗? 另外,为什么我没有在我的机器上获得这个,只在服务器上?

编辑:顺便说一下,file size > 80kb

时出现错误

上传文件的代码:

public ActionResult StoreLogoInSession(HttpPostedFileBase file, int assetID)
        {
            string filename = null;
            if (ValidateOnUpload(file))
            {
                Session.Add("TempLogo", file);
                filename = file.FileName;
                Session.Add("filename", filename);
            }
            return RedirectToAction("Edit", new { id = assetID });
        }

保存代码(这是发生错误时):

public ActionResult SaveLogo(LogoModel m, int assetID)
        {
                HttpPostedFileBase file = (HttpPostedFileBase)Session["TempLogo"];
                var logoModel = new LogoModel();
                var asset = this.GenerateAssetForUploadFile(file, (int)m.Asset.AccountID, m.Asset.TextContents, m.Asset.AssetName);
                this.LogoManagementFacade.SaveLogo(asset);
                logoModel.Asset = asset;
                this.LogoModelList.Add(logoModel);
}

1 个答案:

答案 0 :(得分:0)

解决此问题的第一件事是删除会话并暂时将上传的文件存储在文件系统上,或者如果您在共享文件夹的Web场中运行,或者文件不够大,您可以甚至将它们存储在数据库中。

因此,假设您目前没有在Web场中运行并且您拥有单个Web服务器,并且我们可以将上载的文件存储在临时文件夹中(当然,您将编写可以运行的每个计划脚本晚上并删除超过X天的文件,以避免浪费磁盘空间):

public const string AssetsFolderBase = "~/App_Data";

public ActionResult StoreLogo(HttpPostedFileBase file, int assetID)
{
    string filename = null;
    if (ValidateOnUpload(file))
    {
        var folder = Path.Combine(Server.MapPath(AssetsFolderBase), assetID.ToString());
        if (!Directory.Exists(folder))
        {
            Directory.CreateDirectory(folder);
        }
        folder = Path.Combine(folder, Path.GetFileName(file.FileName));
        file.SaveAs(folder);
    }
    return RedirectToAction("Edit", new { id = assetID });
}

然后当您需要访问它时:

public ActionResult SaveLogo(LogoModel m, int assetID)
{
    var folder = Path.Combine(Server.MapPath(AssetsFolderBase), assetID.ToString());
    var file = Directory.GetFiles(folder).FirstOrDefault();
    if (file == null)
    {
        // no file with this assetID was uploaded => throw an exception
        // or return 404 or something
        return HttpNotFound();
    }

    // at this stage the file variable is pointing to the uploaded filename
    // => you could process it here ...
}

现在,如果你想处理大文件上传,你应该确保adjust the proper settings in your web.config。默认情况下,您的数量限制为4MB。

哦,当您编辑web.config时,请确保添加以下行以确保没有其他开发人员犯同样的错误并且意外地使用ASP.NET会话:

<sessionState mode="Off" />