【问题标题】:UnauthorizedAccessException while uploading excel Data to .Net control on SharePoint 2010将 Excel 数据上传到 SharePoint 2010 上的 .Net 控件时出现 UnauthorizedAccessException
【发布时间】:2014-12-25 18:30:58
【问题描述】:

我在将 Excel 数据上传到部署在 SharePoint 2010 上的 .Net 控件时遇到问题。功能是将 Excel 工作表中的值以逗号分隔的形式上传到 .Net 文本框控件。在从 Excel 读取数据之前,将文档保存到服务器路径 (Server.Mappath) 的应用程序。在我的例子中,我的所有 ASPX 页面都部署在了 SharePoint 2010 Server 的 _Layouts 中。此功能在 SharePoint 2007 环境中运行良好,但在 SharePoint 2010 环境中部署时相同的功能会引发未经授权的异常。下面是我用来从 excel 上传数据和错误消息的代码。谁能帮我解决这个问题或解决任何问题?

SharePoint 2010 上的错误消息:

发生错误:System.UnauthorizedAccessException:对路径“C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\template\layouts\Test\Dev\ABC.xlsx”的访问被拒绝。在 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 在 System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs , String msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor (String path, FileMode mode) at System.Web.HttpPostedFile.SaveAs(String filename) at App.Test.btnFileUpload_Click(Object sender, EventArgs e)

代码示例:

if (fileUpload.HasFile)
{
    strTarget = Server.MapPath(fileUpload.FileName);
    string[] arrCheckExtension = strTarget.Split('.');
    if (arrCheckExtension.Length >= 2)
    {
        if (arrCheckExtension[1].ToString().Equals("xls") || arrCheckExtension[1].ToString().Equals("xlsx"))
        {
            fileUpload.SaveAs(strTarget);
            strConnForExcel = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0;HDR=YES;IMEX=1;""", strTarget);
            strQueryForExcel = String.Format("select id from [{0}$]", "Test");
            OleDbDataAdapter adap = new OleDbDataAdapter(strQueryForExcel, strConnForExcel);
            ds = new DataSet();
            adap.Fill(ds);
            if (ds.Tables[0].Rows.Count > 0)
            {
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    if (strids == "")
                    {
                        strids += ds.Tables[0].Rows[i]["id"].ToString();
                    }
                    else
                    {
                        strids += "," + ds.Tables[0].Rows[i]["id"].ToString();
                    }
                }
                txtUpload.Text = strids;

            }
        }
        else
        {
            Response.Write("<script language='javascript'>alert('Please Select File with .xls or xlsx Extension');</script>");

        }
    }
}

【问题讨论】:

  • 文件似乎没有关闭并且仍在使用中。我看不到哪个对象,但可能你必须Dispose() 一些东西。
  • 这听起来绝对像Permissions 问题如果您是通过网页执行此操作,那么 IIS_USER 可能需要拥有完整的读取/权限而不是您的本地用户帐户.. 除非您的管理员允许所有用户有权访问该共享然后需要设置单个用户的权限我会首先从我开始我在本地遇到同样的事情如果我将文件路径更改为本地驱动器然后在你的情况下一切正常做同样的事情但是越过这一行 fileUpload.SaveAs(strTarget); 看看其余代码是否有效
  • @DJ KRAZE -感谢您的回复。我的管理员将不允许访问该文件夹(_Layouts)。我想知道为什么即使没有授予该文件夹任何特殊权限,这在 SharePoint 2007 上也能正常工作。我不确定是否可以将 excel 保存在本地,因为代码部署在服务器上,我正在调用保存的 excel 表以查询数据并将其转换为逗号分隔。我可以知道您将如何将文档保存到我的本地并从本地调用相同的文件来查询数据吗?或者将 excel 保存到 sharePoint 文档库并使用该链接来查询数据会起作用吗?
  • 这很简单,只需在本地创建一个示例 excel 文件,出于测试目的,硬编码文件路径或将其存储在配置文件中,并在该行上放置一个断点以保存..不要在调试器中执行该行跳过它..也可以绕过该代码,您也可以从实际网络测试它我也有同样的问题,但在本地找到了解决方法..你对调试器有多熟悉
  • 你似乎也省略了一些代码,例如target and strids这些定义在哪里..

标签: c# asp.net .net sharepoint sharepoint-2010


【解决方案1】:

问题出在许可范围内。默认情况下,用于 SharePoint Web 应用程序的帐户无权访问 SharePoint hive 文件夹。这是有充分理由的。但是您可以使用另一个文件夹。此外,您还应该生成上传文件的随机名称,因为两个不同的用户可以上传具有相同名称的不同文件相互覆盖。

你可以使用这样的代码:

var tmpFolderPath = Path.Combine(Directory.GetParent(Environment.GetFolderPath(Environment.SpecialFolder.System)).FullName, "Temp");
var tmpPath = Path.Combine(tmpFolderPath, string.Format("excelImport_{0}.tmp", (Guid.NewGuid())));

它使用系统临时文件夹(默认为c:\windows\temp)并生成随机文件名。

【讨论】:

  • 感谢您的回复。我试过上面的代码。它在我的本地机器上为我工作。我将在我的服务器上尝试相同的操作。您能否让我知道路径“C:/Windows/Temp”位置是否可以安全使用,并且我们是否需要分配任何权限才能将我的文件保存到 Temp 位置?由于我的代码部署在我们的 SharePoint 服务器上,并且它限制了我之前代码中对 hive 文件夹的访问。
  • 我在 Windows 2008 和 Windows 2008 R2 服务器的生产环境中使用此代码。或者您可以使用 Environment.SpecialFolder 枚举尝试另一个特殊文件夹。
  • 再次感谢,所以当您在 windows server 2008 上使用它时,您是否必须为该文件夹分配任何权限才能保存文件?
猜你喜欢
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
相关资源
最近更新 更多