Asp.net mvc 3 “为什么?”;无法访问已关闭的文件";错误出现了吗?为什么只在服务器上?

Asp.net mvc 3 “为什么?”;无法访问已关闭的文件";错误出现了吗?为什么只在服务器上?,asp.net-mvc-3,file-upload,Asp.net Mvc 3,File Upload,我有一个上传图像的代码片段。上载时,它会将文件临时存储在会话中。然后单击“保存”,将文件保存到数据库中 在我的机器上没有问题,但在服务器上,每当我尝试上载一些文件,然后单击“保存”,它会显示一个错误“无法访问已关闭的文件”。在谷歌上,我读到这是因为上传了大量文件。我想确认一下,是不是我上传大文件的问题??或者是别的什么? 还有,为什么我没有在我的机器上得到这个,而只是在服务器上 编辑:顺便说一下,当文件大小>80kb时会出现错误 上载文件的代码: public ActionResult Stor

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

在我的机器上没有问题,但在服务器上,每当我尝试上载一些文件,然后单击“保存”,它会显示一个错误“无法访问已关闭的文件”。在谷歌上,我读到这是因为上传了大量文件。我想确认一下,是不是我上传大文件的问题??或者是别的什么? 还有,为什么我没有在我的机器上得到这个,而只是在服务器上

编辑:顺便说一下,当
文件大小>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 });
        }
保存时的代码(发生错误时):


解决此问题的第一件事是取消会话并将上载的文件临时存储在文件系统中,或者如果您在共享文件夹的web场中运行,或者如果文件不够大,您甚至可以将其存储在数据库中

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

然后,当您需要访问它时:

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 ...
}
现在,如果你想处理大文件上传,你显然应该确保。默认情况下,限制为4MB

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

<sessionState mode="Off" />


使用会话是错误的。使用会话存储上传的文件是一件令人讨厌的事情。请不要。好吧,但是我现在面临的这个问题呢?你面临的问题是设计问题。不要将会话用于此任务。我的意思是,你在工作中使用了错误的工具,现在你在问为什么它不起作用。我不知道该告诉你什么。祝你在这个问题上好运。我没办法。我能给你的最好建议是尽快摆脱这个会话。好的,下面是一个简单的场景:有一个保存和取消按钮。用户可以选择上载文件,然后取消它(我清除此事件的会话)。在这种情况下,如果我不使用会话,我应该在上载时将徽标保存在数据库中,在取消时将其从数据库中删除会话是有害的,因为它们会将状态引入应用程序。默认情况下,它们存储在内存中,这使得它们在web场场景中完全无用。它们的伸缩性不好。在Web农场场景中,你需要考虑一个关闭PROC会话提供程序,使它们完全没用,因为现在你要做I/O调用= >为什么不直接查询相应的数据存储?而且,如果您不使用web场并坚持使用默认的内存中提供程序,您知道,IIS可以随时回收您的应用程序,从而使您可能存储在会话中的所有内容无效。
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 ...
}
<sessionState mode="Off" />