文件上传控制错误 - 其他人使用的访问被拒绝

时间:2011-06-01 11:45:10

标签: c# asp.net file-upload

多次上传同一个文件时我收到此错误......

“进程无法访问文件'd:\ MarketingSystem \ ExcelImport \ Sample.xls',因为它正由另一个进程使用。”

在此行中收到错误

  RevenueDumpFileUpload.PostedFile.SaveAs(Server.MapPath(strFilePathOnServer) + RevenueDumpFileUpload.FileName);

这是我的完整代码.....

 protected void btnImport_Click(object sender, EventArgs e)
{
    if (RevenueDumpFileUpload.HasFile)
    {

        string strFilePathOnServer = ConfigurationManager.AppSettings["RevenueDumpFileLocation"];
        String sConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath(strFilePathOnServer) + RevenueDumpFileUpload.FileName + ";Extended Properties=Excel 8.0;";
        string strPostedFileName = RevenueDumpFileUpload.PostedFile.FileName;
        if (strPostedFileName != string.Empty && RevenueDumpFileUpload.PostedFile.ContentLength != 0)
        {
            //Delete Old file before uploading new file. 
            if (System.IO.File.Exists(strFilePathOnServer))
            {
                System.IO.File.Delete(strFilePathOnServer);

            }
            //Save-Upload File to server. 
            RevenueDumpFileUpload.PostedFile.SaveAs(Server.MapPath(strFilePathOnServer) + RevenueDumpFileUpload.FileName);
            RevenueDumpFileUpload.FileContent.Dispose();
        }
        OleDbConnection Exlcon = new OleDbConnection(sConnectionString);
        try
        {
            Exlcon.Open();
        }
        catch
        {
            return;
        }
        finally
        {
            RevenueDumpFileUpload.PostedFile.InputStream.Flush();
            RevenueDumpFileUpload.PostedFile.InputStream.Close();
        }

        OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM [Sheet1$]", Exlcon);
        OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();
        objAdapter1.SelectCommand = objCmdSelect;
        objAdapter1.Fill(objDataset1, "XLData");
        methodtosave();

    }

}

在我的网络配置文件中:

    <appSettings>
<add key="RevenueDumpFileLocation" value="~/ExcelImport/"/>

如何解决这个问题?

帮帮我......

提前致谢

2 个答案:

答案 0 :(得分:1)

好吧,如果OleDbConnection的作用类似于SqlConnection对象,那么你就有了这一行:

Exlcon.Open();

正在打开连接,但您没有匹配的行来关闭连接。这意味着Jet数据库提供程序将继续保持此文件处于打开状态,直到连接对象被垃圾回收。包装这一行会好得多:

OleDbConnection Exlcon = new OleDbConnection(sConnectionString);

在一个using语句中,其主体扩展到函数的其余部分,以便保证它被关闭/处理。

接下来,您是否考虑过如果多个用户同时上传具有相同名称的文件会发生什么 - 此方法将被破坏。最好在服务器上使用与用户ID或会话ID相关的新文件名,并在整个方法中包装try / finally以确保在使用后删除该文件。

以上可能是您当前问题的原因,如果这是生产中的错误 - 如果两个人同时尝试上传,那么他们的两个请求都可能超过“删除(如果存在)”部分代码,然后一个请求设法保存文件并打开连接,然后另一个请求将在尝试保存相同的文件名时失败。

答案 1 :(得分:0)

当您尝试删除文件时,忘记传递File NameFile Extension

if (System.IO.File.Exists(Server.MapPath(strFilePathOnServer) + strPostedFileName+ 
    System.IO.Path.GetExtension(RevenueDumpFileUpload.FileName)))
{
   System.IO.File.Delete(Server.MapPath(strFilePathOnServer) + strPostedFileName +
   System.IO.Path.GetExtension(RevenueDumpFileUpload.FileName) );
}