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
5
public void uploadFile(object sender , EventArgs E) {
6
//检查上传文件不为空
7
if(inputFile.PostedFile.ContentLength > 0) {
8
//设定上传文件的保存路径
9
string strSaveDir = "./upload/";
10
string strName = inputFile.PostedFile.FileName;
11
//取得文件名(抱括路径)里最后一个"."的索引
12
int intExt = strName.LastIndexOf(".");
13
//取得文件扩展名
14
string strExt = strName.Substring(intExt);
15
//这里我自动根据日期和文件大小不同为文件命名,确保文件名不重复
16
/**//*
17
DateTime datNow = DateTime.Now;
18
string strNewName = datNow.DayOfYear.ToString() + inputFile.PostedFile.ContentLength.ToString() + strExt; */
19
//取得文件名(包括路径)里最后一个"\"的索引
20
int intPath = strName.LastIndexOf("\\");
21
//取得文件名(不包括路径)
22
string strNewName = strName.Substring(intPath);
23
//保存文件到你所要的目录,这里是IIS根目录下的upload目录.你可以改变.
24
//注意: 我这里用Server.MapPath()取当前文件的绝对目录.在asp.net里"\"必须用"\\"代替
25
inputFile.PostedFile.SaveAs(Server.MapPath(strSaveDir + strNewName));
26
//得到这个文件的相关属性:文件名,文件类型,文件大小
27
labelUpResult.Text = "上传成功!";
28
labelFileName.Text = "文件源:" + strName;
29
labelFileExt.Text = "文件类型:" + inputFile.PostedFile.ContentType + "( " + strExt + " )";
30
labelFileSize.Text = "文件大小:" + (inputFile.PostedFile.ContentLength / 1024).ToString() + " K Byte(s)";
31
} else {
32
labelUpResult.Text = "请选择你要上传的文件!";
33
labelFileName.Text = "";
34
labelFileExt.Text = "";
35
labelFileSize.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
<%@ page Language = "C#" debug = "true" %>2
<%@ Import Namespace = "System.IO" %>3
<script language = "C#" runat = "server">4

5
public void uploadFile(object sender , EventArgs E) {6
//检查上传文件不为空7
if(inputFile.PostedFile.ContentLength > 0) {8
//设定上传文件的保存路径9
string strSaveDir = "./upload/";10
string strName = inputFile.PostedFile.FileName;11
//取得文件名(抱括路径)里最后一个"."的索引12
int intExt = strName.LastIndexOf(".");13
//取得文件扩展名14
string strExt = strName.Substring(intExt);15
//这里我自动根据日期和文件大小不同为文件命名,确保文件名不重复16
/**//*17
DateTime datNow = DateTime.Now; 18
string strNewName = datNow.DayOfYear.ToString() + inputFile.PostedFile.ContentLength.ToString() + strExt; */19
//取得文件名(包括路径)里最后一个"\"的索引20
int intPath = strName.LastIndexOf("\\");21
//取得文件名(不包括路径)22
string strNewName = strName.Substring(intPath); 23
//保存文件到你所要的目录,这里是IIS根目录下的upload目录.你可以改变.24
//注意: 我这里用Server.MapPath()取当前文件的绝对目录.在asp.net里"\"必须用"\\"代替25
inputFile.PostedFile.SaveAs(Server.MapPath(strSaveDir + strNewName)); 26
//得到这个文件的相关属性:文件名,文件类型,文件大小27
labelUpResult.Text = "上传成功!";28
labelFileName.Text = "文件源:" + strName;29
labelFileExt.Text = "文件类型:" + inputFile.PostedFile.ContentType + "( " + strExt + " )";30
labelFileSize.Text = "文件大小:" + (inputFile.PostedFile.ContentLength / 1024).ToString() + " K Byte(s)";31
} else {32
labelUpResult.Text = "请选择你要上传的文件!";33
labelFileName.Text = "";34
labelFileExt.Text = "";35
labelFileSize.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表示你的操作系统安装的路径)
在实际的应用中,我们发现很多的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
}
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
else6
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
else14
return string.Format("{0}",Config.CurrentBlog(context).ImagePath);15
}这样就可以让DotText将文件不按照目录分级保存,就可以成功的发布照片了
posted on 2005-09-17 20:15 K_Reverter 阅读(280) 评论(0) 收藏 举报


public
浙公网安备 33010602011771号