这个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



2



3



4

5



6

7



8

9

10

11

12

13

14

15

16


17

18

19

20

21

22

23

24

25

26

27

28

29

30

31



32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

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表示你的操作系统安装的路径)

2

3

4

5

6

7

8

9

10

11

而这个问题我在网上没有找到替代的解决方案,所以我打算索性不创建目录算了,,所以我在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
}

2



3

4

5

6

7

8

9

10



11

12

13

14

15

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