K_Reverter的网页开发记录

要么不做,要么就当作艺术品来做!

导航

DotText发布照片的问题解决了

 

 这个Blog上次我测试的时候发现照片上传的功能不能用,现在改好了。

开始的时候出现这样的错误提示:

异常详细信息: System.IO.DirectoryNotFoundException: 未找到路径“D:\”的一部分。

开始我以为是因为空间不支持System.IO,(我申请的空间支持ISO,文件读写都正常),所以我打算去网上找一个ASP.NET的文件上传组件,可是找来找去没有找到合适的,最后发现一段代码Asp.net 文件上传的实例,抄录如下

 1<%@ page Language = "C#" debug = "true" %>
 2<%@ Import Namespace = "System.IO" %>
 3<script language = "C#" runat = "server">
 4
 5public void uploadFile(object sender , EventArgs E) 
{
 6//检查上传文件不为空

 7if(inputFile.PostedFile.ContentLength > 0{
 8//设定上传文件的保存路径

 9string strSaveDir = "./upload/";
10string strName =
 inputFile.PostedFile.FileName;
11//取得文件名(抱括路径)里最后一个"."的索引

12int intExt = strName.LastIndexOf(".");
13//取得文件扩展名

14string strExt = strName.Substring(intExt);
15//这里我自动根据日期和文件大小不同为文件命名,确保文件名不重复

16/**//*
17DateTime datNow = DateTime.Now; 
18string strNewName = datNow.DayOfYear.ToString() + inputFile.PostedFile.ContentLength.ToString() + strExt; */

19//取得文件名(包括路径)里最后一个"\"的索引
20int intPath = strName.LastIndexOf("\\");
21//取得文件名(不包括路径)

22string strNewName = strName.Substring(intPath); 
23//保存文件到你所要的目录,这里是IIS根目录下的upload目录.你可以改变.

24//注意: 我这里用Server.MapPath()取当前文件的绝对目录.在asp.net里"\"必须用"\\"代替
25inputFile.PostedFile.SaveAs(Server.MapPath(strSaveDir + strNewName)); 
26//得到这个文件的相关属性:文件名,文件类型,文件大小

27labelUpResult.Text = "上传成功!";
28labelFileName.Text = "文件源:" +
 strName;
29labelFileExt.Text = "文件类型:" + inputFile.PostedFile.ContentType + "" + strExt + " )"
;
30labelFileSize.Text = "文件大小:" + (inputFile.PostedFile.ContentLength / 1024).ToString() + " K Byte(s)"
;
31}
 else {
32labelUpResult.Text = "请选择你要上传的文件!"
;
33labelFileName.Text = ""
;
34labelFileExt.Text = ""
;
35labelFileSize.Text = ""
;
36}

37}

38
</script>
39
40<html>

41<head>
42<title>上传文件</title>
43</head>
44<body>
45<div align="center">
46
47<table width="100%" border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#eeeeee" id="AutoNumber1">

48<form id="formFile" method="post" action="" enctype="multipart/form-data" runat="server">
49<tr>
50<td align="center">
51<input type="file" id="inputFile" name="inputFile" runat="server" size="64">
52</td>
53</tr>
54<tr>
55<td align="center">
56<input type="button" value="Upload" OnServerClick="uploadFile" id="Button1" name="Button1" runat="server">
57</td>
58</tr>
59<tr>
60<td align="center">
61<asp:Label id="labelUpResult" runat="server" text="" font-bold="True" forecolor="#FF0000"/><br>
62<asp:Label id="labelFileName" runat="server" text="" font-bold="True" forecolor="#FF0000"/><br>
63<asp:Label id="labelFileExt" runat="server" text="" font-bold="True" forecolor="#FF0000"/><br>
64<asp:Label id="labelFileSize" runat="server" text="" font-bold="True" forecolor="#FF0000"/><br>
65</td>
66</tr>
67</form>
68</table>
69
70</div>

71</body>
72</html>
73

可是我在应用代码的时候才发现,其实根本不是这个问题,而是DotText根据每一个照片分类创建目录的时候出现的错误,在网上有一篇相关的解释 关于未找到路径“D:\”的一部分,同样,内容摘抄如下:

 1在实际的应用中,我们发现很多的Asp.NET空间提供商并没有相关的经验,而依然停留在Asp的管理模式中。
 2
其中最常见,就是目录权限的配置上:他们大多数沿习了Asp的经验,给用户所在目录赋于所有权限,然后将磁盘根目录的相关权限全部去掉。
 3
这样以来就导致一个问题,就是Asp.NET中的 Server.MapPath 无法使用,这个方法却是创建目录或文件所必须的,如下面创建目录的代码:
 4
Directory.CreateDirectory(Server.MapPath("Test"));
 5
这是一个非常简单的操作:在用户的当前目录下创建一个名为 "Test" 的子目录。
 6
然后就是这样一个操作在没有正确配置的空间就会无法运行,它会提示为什么会有这样的错误呢?
 7
原因就是 Server.MapPath() 这个方法,这个方法是让一个相对路径转为绝对路径,而在转换的过程序中,.NET框架需要得到当前硬盘的一些属性,如盘符等,而这个时候,空间提供商却将.Net用户对磁盘根目录的权限全部拒绝,从而导致程序无法正常运行。
 8

 9
有个时候,空间提供商会说:"你为什么要用绝对路径,而不使用相对路径呢?"
10
这是行不通的,如果你这样程序:Directory.CreateDirectory("Test");
11系统在运行的时候,并不是象你想像的那样,会自动在用户的当前目录下创建目录,而会尝试在 "C:\WINNT\System32" 路径下创建目录 (其中的C:\WINNT表示你的操作系统安装的路径)

而这个问题我在网上没有找到替代的解决方案,所以我打算索性不创建目录算了,,所以我在web.config中添加了控制是否分级创建目录的选项
              <AllowCreateFolder>false</AllowCreateFolder>

然后在获取文件保存路径的方法上做如下手脚:

 1        public static string LocalGalleryFilePath(HttpContext context, int categoryid)
 2        
{
 3            if
(Config.Settings.AllowCreateFolder)
 4                return string.Format("{0}\\{1}\\"
,Config.CurrentBlog(context).ImageDirectory,categoryid);
 5            else

 6                return string.Format("{0}\\",Config.CurrentBlog(context).ImageDirectory);
 7        }

 8
 9        public static string HttpGalleryFilePath(HttpContext context, int
 categoryid)
10        
{
11            if
(Config.Settings.AllowCreateFolder)
12                return string.Format("{0}{1}/"
,Config.CurrentBlog(context).ImagePath,categoryid);
13            else

14                return string.Format("{0}",Config.CurrentBlog(context).ImagePath);
15        }

这样就可以让DotText将文件不按照目录分级保存,就可以成功的发布照片了

posted on 2005-09-17 20:15  K_Reverter  阅读(272)  评论(0编辑  收藏  举报