将Excel上的Excel数据上载到SharePoint 2010上的.Net控件时出现UnauthorizedAccessException

时间:2014-10-29 21:11:23

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

我遇到了将Excel数据上传到部署在SharePoint 2010上的.Net控件的问题。该功能是将Excel表格中的值上传为.Net文本框控件的逗号分隔。在从Excel读取数据之前,文档将保存到服务器路径(Server.Mappath) 申请。就我而言,它是SharePoint 2010 Server的_Layouts,其中部署了所有ASPX页面。此功能在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)at System.IO.FileStream.Init(String path,FileMode mode,FileAccess access,Int32 rights,Boolean useRights,FileShare share,Int32 bufferSize,FileOptions options,SECURITY_ATTRIBUTES secAttrs) System.IO.FileStream..ctor上的System.IO.FileStream..ctor(String path,FileMode mode,FileAccess access,FileShare share,Int32 bufferSize,FileOptions options,String msgPath,Boolean bFromProxy)中的,String msgPath,Boolean bFromProxy) (String path,FileMode模式)位于App.Test.btnFileUpload_Click的System.Web.HttpPostedFile.SaveAs(String filename)(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>");

        }
    }
}

1 个答案:

答案 0 :(得分:0)

问题在于许可。默认情况下,用于SharePoint Web应用程序的帐户无权访问SharePoint配置单元文件夹。这是有充分理由的。但您可以使用其他文件夹。此外,您还应该生成上传文件的随机名称,因为两个不同的用户可以上传相同名称的不同文件。

您可以使用以下代码:

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),并生成随机文件名。