在HttpPostedFileBase MVC3中替换文件

时间:2014-03-04 15:12:42

标签: asp.net-mvc-3 httppostedfilebase

如果文件上传的名称已经在指定路径中,则显示错误。我想用新文件替换。我已经放错了和代码。请帮助替换现有图像。

错误:进程无法访问文件'',因为它正由另一个进程使用。

代码:

[HttpPost]
public ActionResult MyUpload(HttpPostedFileBase file)
{
    string filePath = string.Empty;
    string path = "C:\\";
    string filePath = string.Empty;

    try
    {
        if (file != null && file.ContentLength > 0)
        {
           filePath = path + file.FileName;

            file.SaveAs(filePath);
            file.InputStream.Dispose();
            GC.Collect();

           // other operations, where can occur an exception 
           // (because the uploaded file can have a bad content etc.)
        }
    }
    catch (Exception e)
    {
    }
}

2 个答案:

答案 0 :(得分:0)

根据您发布的内容,我建议如下:

[HttpPost]
public ActionResult Foo(HttpPostedFileBase file)
{
    var path = @"C:\";
    var filename = file.FileName;

    file.SaveAs(System.IO.Path.Combine(path, filename));

    // do stuff here.

    return RedirectToAction("Index");
}

答案 1 :(得分:0)

我有同样的问题。我有一个名为"文件"的子文件夹。我使用file.SaveAs()上传文件的位置('文件'属于' HttpPostedFileBase' [使用MVC])。经过一些本地调查和在线研究后,发现IIS工作线程/进程正在锁定我的文件。起初我以为{HttpPostedFileBase}.SaveAs()以某种方式锁定了我的文件。我甚至尝试(先)关闭,然后处置{HttpPostedFileBase}.InputStream,这也没有帮助。最后,它根本与文件上传过程无关。上传文件(PDF)后,我使用ITextSharp处理它,但忘记处理对象包装器(因此它可能位于GC中)。因此,由于锁定的现有文件,下一个文件上载失败。顺便说一句,我也试过了file.InputStream.Dispose(); file.InputStream.Close(); GC.Collect();,但最终将它们全部删除了,现在它仍然完美无缺。最重要的是,如果IIS工作进程正在锁定您的文件,那么可能是一个很好的理由 - 您的代码中某处缺少某些内容,而且很可能MVC框架或IIS本身并不流氓。 ;)另外,事实证明,如果文件存在,{HttpPostedFileBase}.SaveAs()将覆盖文件,因此无需先删除它们。

另一个提示:我根据您的授权设置方式(无论您是否使用IIS进程标识或登录的用户标识)在某处查看是否正在创建文件。在某些情况下,一个登录用户可能会创建一个文件,然后该用户将成为所有者,而另一个用户的另一个同名文件可能会被阻止;在特殊情况下(如基于Intranet的Web应用程序)可能需要牢记。