我用asp.net写了一段上传程序的代码由于我的页面在(secure)安全目录下,代码如下:
private void btnupzb_Click(object sender, System.EventArgs e)
{
System.Web.HttpPostedFile hpf=this.upzb.PostedFile;
if(hpf.FileName.ToString().Length>0)
{
//取得上传文件名
                                    string strFilename;
char[] de={'\\'};
string[] AFilename=hpf.FileName.Split(de);
strFilename=AFilename[AFilename.Length-1];
//取得当前应用程序根路径
                                     string path=Server.MapPath(".");
char[] de1={'s'};
string[] n=path.Split(de1);
string N=n[n.Length-2];
this.lblzb.Text=strFilename;

//文件上传至应用程序根路径
hpf.SaveAs(N+"\\"+strFilename);
}
else
{
lblerror.Text="您没有选择文件!";
}
}
OK ,我在本地调试的时候这段代码可以通过,并且文件也上传到了iis所指定的应用程序主目录下
然而我将应用程序放到发布WEB服务器上,就会报:
“/”应用程序中的服务器错误。
--------------------------------------------------------------------------------未找到路径“c:\windows\system32\inetsrv\martelc.com\新建 文本文档1.txt”的一部分。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.IO.DirectoryNotFoundException: 未找到路径“c:\windows\system32\inetsrv\martelc.com\新建 文本文档1.txt”的一部分。这个错误,我并没有指定过这个目录阿?这个inetsrv目录是怎么回事?
在web服务器上iis指定的目录是inetpub\wwwroot\应用程序这个目录阿。
哪位大虾能告诉我怎么回事,应该怎么解决,顺便说下,web服务器是2003,我开发用的是2000+.net2003后来我将路径指定为绝对路径string path="c:\inetpub\wwwroot\aa",可是结果还是一样,我认为应该是服务器的问题,可是问题出在哪里啊?请各位高手指点一下小弟吧,我都要疯掉了!! 服务器iis设置与我本地设置也是一样,但是每次inetsrv目录下就会莫名其妙出现一个类似我网站名字的目录.这个服务器同时也有几个WEB站点在跑,其运行正常.

解决方案 »

  1.   

    5555,哪位大哥好心人帮忙下阿,我即使去掉hpf.SaveAs(N+"\\"+strFilename);
    改为this.Response.Write(N+"\\"strFilename);服务器运行也报同样的错.本地运行却没有一点问题.为什么啊?
      

  2.   

    那个目录是应用程序的运行目录,只在运行的时候才有效,Request.PhysicalApplicationPath 获取当前正在执行的服务器应用程序的根目录的物理文件系统路径。不用那么麻烦的。
      

  3.   

    如果本地调试通过,一般来说,应该是IIS设置或权限的问题
    如果目录是NTFS格式,请确保everyone用户有写的权限另外,建议楼主升级到VS2005,用fileupload控件直接就可以取得文件名,不用转换得那么麻烦.
      

  4.   

    你的路径有明显的问题:
    hpf.SaveAs(N+"\\"+strFilename);
    你这个N,
    string path=Server.MapPath(".");
    char[] de1={'s'};
    string[] n=path.Split(de1);
    string N=n[n.Length-2];
    看看,它等于的是当前目录的上一级父目录名,这没有错,但是保存的时候你用:
    hpf.SaveAs(N+"\\"+strFilename);
    这样的话,可想而知,是一个相对路径而非绝对路径,运行到Save的时候,
    它就自动给这个相对路径加上了运行目录,也就是
    c:\windows\system32\inetsrv\
    这样自然错了,你应该用绝对路径保存:
    hpf.SaveAs(Server.MapPath("../");+"\\"+strFilename);
    或者你知道文件是放在网站根目录下的某目录如UPLOAD中的话,就这样:
    hpf.SaveAs(Server.MapPath("/upload");+"\\"+strFilename);
      

  5.   

    对不起,刚才看 char[] de1={'s'}; 没注意,还以为是'\\',
    用'S'去分割是什么意思呢?  
    不过,不影响出错的原因
      

  6.   

    关键是我本地调试一切正常啊,还是不行.一到web服务器就出问题,哪怕我注释掉磁盘操作命令SaveAs和string path=Request.PhysicalApplicationPath等命令他也报一样的错误未找到路径,我命令里面就没有一条找路径的命令了.我气得哭,更不要说是打印路径了.
      

  7.   

    string sFileName=Server.MapPath(Request.ApplicationPath)+"\\文件夹名"+fileName(文件名);
    用这个试试
      

  8.   

    this.txtFile.PostedFile.SaveAs(sFileName);
    这是上传
      

  9.   

    看来还是不行不过在堆栈跟踪的时候我发现有个现象
    [DirectoryNotFoundException: 未找到路径“c:\windows\system32\inetsrv\martelc.com\新建文本文档111.txt”的一部分。]
       System.IO.__Error.WinIOError(Int32 errorCode, String str) +287
       dpjwz.control.alterApplication.btnupzb_Click(Object sender, EventArgs e) in c:\inetpub\wwwroot\dpjwz\control\alterapplication.ascx.cs:225
       
    上面的这个c:\inetpub\wwwroot\dpjwz\control\alterapplication.ascx.cs:225并不存在
    实际在服务器上的路径为c:\inetpub\wwwroot\www.smartelc.com\control\alterapplication.ascx.cs:225
    dpjwz 这个目录是在我开发的时候使用的一个目录,上传至服务器后,我把文件里关于这个目录的信息已经删除了.这里出现了这个目录是什么原因阿?我本地调试的也是删除了这个目录的,调试通过.
      

  10.   

    会走路的鱼提供的方案我试过了,报同样的错.看来不是这个原因阿,不过还是很感谢你咯.
    IT菜鸟所说的根我的没什么区别阿,我前面就已经把上传对象实例化了 hpf对象阿,你意思是先指定完整的存放路径阿,晕,我看看.估计和这个差不多
      

  11.   

    个人感觉是权限问题,检查一下,是否开足了权限咯!
    磁盘写入权限或IIS权限等,认真检查一遍
      

  12.   

    everyone用户给了完全控制权限,程序没有具体给出那条语句出错,出错全文如下:
    “/”应用程序中的服务器错误。
    --------------------------------------------------------------------------------未找到路径“c:\windows\system32\inetsrv\martelc.com\新建文本文档111.txt”的一部分。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.IO.DirectoryNotFoundException: 未找到路径“c:\windows\system32\inetsrv\martelc.com\新建文本文档111.txt”的一部分。源错误: 执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。  堆栈跟踪: 
    [DirectoryNotFoundException: 未找到路径“c:\windows\system32\inetsrv\martelc.com\新建文本文档111.txt”的一部分。]
       System.IO.__Error.WinIOError(Int32 errorCode, String str) +287
       System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean useAsync, String msgPath, Boolean bFromProxy) +888
       System.IO.FileStream..ctor(String path, FileMode mode) +52
       System.Web.HttpPostedFile.SaveAs(String filename) +48
       dpjwz.control.alterApplication.btnupzb_Click(Object sender, EventArgs e) in c:\inetpub\wwwroot\dpjwz\control\alterapplication.ascx.cs:225
       System.Web.UI.WebControls.Button.OnClick(EventArgs e) +108
       System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +57
       System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18
       System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
       System.Web.UI.Page.ProcessRequestMain() +1292
    实际上即使我注释掉上传语句及取路径语句,只保留下取文件名的语句即:
     System.Web.HttpPostedFile hpf=this.upzb.PostedFile;//取得上传文件名
    string strFilename;
    char[] de={'\\'};
    string[] AFilename=hpf.FileName.Split(de);
    strFilename=AFilename[AFilename.Length-1];this.lblzb.Text=strFilename;也是报同样的错误,郁闷中...
      

  13.   

    你运行的代码肯定不是你现在的代码,否则System.Web.HttpPostedFile.SaveAs(String filename) 这一句不可能出现,自己好好检查一下吧
      

  14.   

    [DirectoryNotFoundException: 未找到路径“c:\windows\system32\inetsrv\martelc.com\新建文本文档111.txt”的一部分。]
    已经提示的很清楚了,
    asp.net 创建一个文件时,要保存这个文件的所有上级父文件夹都有读的权限,只要有一级没有,就报这个错。
      

  15.   

    哎,c:\windows\system32\inetsrv\老是莫名其妙出现我的网站所有文件及目录,删了运行有跑出来了,估计读的是那个目录里面的文件.但是我IIS里面已经指定了目录啦.完全无语了
      

  16.   

    当然会出来了,那是iis的运行目录,下面有iis要用到的许多子目录,不知道你的iis挂了没有。
      

  17.   

    呵呵,肯定是你没有把修改编译后的dll替换掉web服务器上原来的,要不然怎么还会运行原来的代码。周末了,下班了,到家再帮你看看............
      

  18.   

    直接说,WIN2003服务器的设置有够难度.
      

  19.   

    我觉得是 .netframework 的权限设置问题.建议 先通过 aspnet_regiis /u 命令撤消 framework 对iis的注册, 在 aspnet_regiis /i 重新注册一下 试一下,或者干脆重新装一下.netframework试试
      

  20.   

    这是我写的一个文件上传过程,VB的。其中GetNewFileName()是一个处自定义过程,用来获取一个有效的文件名,SaveZPInfo 是把相关信息积存到库里的。Public Dim AImageExt() As String={".BMP",".JPG",".GIF"},AImageExt是个数组,用来限定上传文件的扩展名。能正常运行。
    Function SaveImage() as Boolean '图片上传
                If Images.postedFile.ContentLength=0 then
                   lblAdd.text="图片上传失败!"
                   return false
                end if
                If Images.postedFile.ContentLength > 1048576 then '图片不能大于1M
                   lblAdd.text="图片不能大于1M,请做适当地处理后再上传。"
                   return false
                end if            Dim FileName as string
    FileName=Images.PostedFile.FileName
    'lblSoftImage.text=FileName
    if Array.IndexOf(AImageExt,Path.GetExtension(FileName).ToUpper ) < 0 then
          lblAdd.text="只能上传BMP、JPG、GIF格式图片"
       Return False
    End IF
    SoftImageName=GetNewFileName(Request.QueryString("ID"),(Path.GetExtension(FileName)).ToUpper)
    Images.postedFile.SaveAs(SoftImageName)
    SaveZPInfo(Request.QueryString("ID"),Path.GetFileName(SoftImageName))
                lblAdd.text="照片上传成功"
    Return True
    end Function '图片上传
      

  21.   

    建议注释掉 SaveAs ,先把你已经生成的带绝对路径的文件名输出看看,是不是你想放到的位置。这个肯定是路径有问题了。另外建议在获取物理路径时用 WEB根下面的一个具体文件夹做参照,例如你想把文件传到根下的 Photo/AJDJB  文件夹下,就用这种方式来获取绝对路径:Server.MapPath("Photo/AJDJB/.")
    上面那个例子中的 GetNewFileName()函数:
            Function GetNewFileName(ID as String,ext as string) as string'给一个扩展名返回一个可用的文件名
                  Dim NewFileName As String
      Dim Dir As String=Server.MapPath("Photo/AJDJB/.")
                  Dim i as integer=1
      Dim sFileName as string=Server.MapPath("Photo/AJDJB/.") & "\" & ID & "_" 
      
      NewFileName=sFileName & "1" & ext
          
      While (File.Exists(NewFileName))
          i=i+1
      NewFileName=sFileName & i & ext
      End While
                  
      Return NewFileName
    End Function
      

  22.   

    应该是服务器的路径出错了,获取到的路径是错误的,当然就找不到要找的文件了。一个笨方法,不知道有没有用!
    先写一个类:
    Public Class GetServer
    Public Function getserverpath()
                Dim serverpath As String
                serverpath = System.Web.HttpContext.Current.Server.MapPath("")
                Return serverpath
    End Function
    End Class然后在你要用到server.path的时候调用这个类来获取服务器路径。
      

  23.   

    100%是程序的原因!你没有用Server.MapPath,你在本地上传的文件都到C;\Windows\System32文件夹下了,而在服务器上C盘为NTFS格式(楼主的C盘应该为FAT32吧),你没有写权限,所以报这样的错!