// 获取所有文件
HttpFileCollection allFiles = request.Files;
想这样使用
foreach (HttpPostedFile file in allFiles) {
// 但是这里报错,说字符串不能转成HttpPostedFile
}
但是这样不行,虽然知道了不行了,但是很想知道到底在什么情况下才能使用foreach,请各位高手在这里讲解一下,谢谢!
32 个解决方案
#1
奇怪的是,那个叫什么思归的居然也这么写过,真是很奇怪了,难道以前可以?
#2
关注...
#3
HttpFileCollection allFiles = Request.Files;
想这样使用
foreach (HttpPostedFile file in allFiles) {
这样是没有问题的
你的“// 但是这里报错,说字符串不能转成HttpPostedFile ”
代码是什么?
想这样使用
foreach (HttpPostedFile file in allFiles) {
这样是没有问题的
你的“// 但是这里报错,说字符串不能转成HttpPostedFile ”
代码是什么?
#4
foreach (HttpPostedFile file in allFiles) { 这一行报错了
#5
foreach (HttpPostedFile file in allFiles) {
// 但是这里报错,说字符串不能转成HttpPostedFile
}
应该是你循环里的代码有错,是不是把file 赋值给一个字符串变量了?
foreach (HttpPostedFile file in allFiles) 这是没错的,仔细检查下代码
// 但是这里报错,说字符串不能转成HttpPostedFile
}
应该是你循环里的代码有错,是不是把file 赋值给一个字符串变量了?
foreach (HttpPostedFile file in allFiles) 这是没错的,仔细检查下代码
#6
学.NET来第一次遇到这种问题,因为见过它可以以数组形式方访问,所以就想试试foreach,结果试出问题了
#7
实现了IEnumerable和IEnumerator两个接口的数据结构都可以用foreach遍历
#8
foreach 应用于Collection,List<T>等的遍历
#9
谢谢楼上的回复!
查过了,确实是那个地方出问题了,如果改成
无法将类型为“System.String”的对象强制转换为类型“System.Web.HttpPostedFile”。
完整代码
查过了,确实是那个地方出问题了,如果改成
无法将类型为“System.String”的对象强制转换为类型“System.Web.HttpPostedFile”。
完整代码
public static string[] PutFileToFolder(HttpRequest request)
{
// 设置文件存放路径
string folderPath = HttpContext.Current.Server.MapPath(string.Format("~/{0}/{1}/", STORE_FILE_PATH, DateTime.Now.ToString("yyyyMM")));
// 文件不存在
if (System.IO.Directory.Exists(folderPath) == false)
System.IO.Directory.CreateDirectory(folderPath);
// 文件存放数组
ArrayList filelist = new ArrayList();
// 获取所有文件
HttpFileCollection allFiles = request.Files;
for (int i = 0; i < allFiles.Count; i++) // 这里不出错
{
}
foreach (HttpPostedFile myfiles in allFiles) { // 这里出错
}
////STORE_FILE_PATH
//string filePath = string.Empty;
//string fileExt = string.Empty;
//for (int i = 0; i < allFiles.Count; i++)
//{
// HttpPostedFile file = allFiles[i];
// // 空文件
// if (file.ContentLength == 0) continue;
// fileExt = System.IO.Path.GetExtension(file.FileName);
// // 设置文件路径,名字,后缀
// filePath = string.Format("{0}{1}{2}", folderPath, DateTime.Now.Ticks.ToString(), fileExt);
// // 保存文件
// file.SaveAs(filePath);
// // 将路径加入列表
// filelist.Add(filePath);
//}
return new string[] { };
}
#10
可以使用For
HttpPostedFile file = allFiles[i];
HttpPostedFile file = allFiles[i];
#11
IEnumerable这个已经被实现了,但是还是不能遍历,不知道是什么原因!高手解答
#12
在我这边
没有任何问题,不知道楼主问题出在哪。
HttpRequest req = this.Request;
HttpFileCollection allFiles = req.Files;
foreach (HttpPostedFile file in allFiles)
{
}
没有任何问题,不知道楼主问题出在哪。
#13
看MSDN上的一段话:
In C#, it is not strictly necessary for a collection class to inherit from IEnumerable and IEnumerator in order to be compatible with foreach; as long as the class has the required GetEnumerator, MoveNext, Reset, and Current members, it will work with foreach.
只要类实现了GetEnumerator, MoveNext, Reset, Current四个方法和属性就可以了,不一定说要实现IEnumerable 和IEnumerator 接口。而
HttpFileCollection 反射出来的结果为下面的内容
public sealed class HttpFileCollection : NameObjectCollectionBase
{......}
而NameObjectCollectionBase实现了ICollection, IEnumerable, ISerializable, IDeserializationCallback实现了四个接口,显然这符合foreach的要求.......
说类型不对,是因为Current属性的类型无法转换为要求的类型,你可以试试把string换成HttpPostedFile看看,我看应该可以了。
In C#, it is not strictly necessary for a collection class to inherit from IEnumerable and IEnumerator in order to be compatible with foreach; as long as the class has the required GetEnumerator, MoveNext, Reset, and Current members, it will work with foreach.
只要类实现了GetEnumerator, MoveNext, Reset, Current四个方法和属性就可以了,不一定说要实现IEnumerable 和IEnumerator 接口。而
HttpFileCollection 反射出来的结果为下面的内容
public sealed class HttpFileCollection : NameObjectCollectionBase
{......}
而NameObjectCollectionBase实现了ICollection, IEnumerable, ISerializable, IDeserializationCallback实现了四个接口,显然这符合foreach的要求.......
说类型不对,是因为Current属性的类型无法转换为要求的类型,你可以试试把string换成HttpPostedFile看看,我看应该可以了。
#14
我的.net环境是2.0,不知道是不是版本不合的原因。我这边是出问题了。呵呵!
#15
现在的场合很简单了,我改了代码
前台aspx
<div id="divFilesPanel">
<ul>
<li><asp:FileUpload ID="myfile" runat="server" /></li>
</ul>
<div><input type="button" id="addUploadFile" value="添加上传控件" /> <asp:Button ID="btnUploadFile" runat="server" Text="开始上传" OnClick="btnUploadFile_Click" /></div>
</div>
后台cs
protected void btnUploadFile_Click(object sender, EventArgs e)
{
foreach (HttpPostedFile file in Request.Files)// 无法将类型为“System.String”的对象强制转换为类型“System.Web.HttpPostedFile”。
{ }
// WebUtility.PutFileToFolder(Request);
}
还出那个问题!
前台aspx
<div id="divFilesPanel">
<ul>
<li><asp:FileUpload ID="myfile" runat="server" /></li>
</ul>
<div><input type="button" id="addUploadFile" value="添加上传控件" /> <asp:Button ID="btnUploadFile" runat="server" Text="开始上传" OnClick="btnUploadFile_Click" /></div>
</div>
后台cs
protected void btnUploadFile_Click(object sender, EventArgs e)
{
foreach (HttpPostedFile file in Request.Files)// 无法将类型为“System.String”的对象强制转换为类型“System.Web.HttpPostedFile”。
{ }
// WebUtility.PutFileToFolder(Request);
}
还出那个问题!
#16
无法将类型为“System.String”的对象强制转换为类型“System.Web.HttpPostedFile”。
我刚才试了一下也报这个错,
for(int iFile = 0; iFile < files.Count; iFile++)
{
/**////'检查文件扩展名字
HttpPostedFile postedFile = files[iFile];
用for循环就不会,晕
我刚才试了一下也报这个错,
for(int iFile = 0; iFile < files.Count; iFile++)
{
/**////'检查文件扩展名字
HttpPostedFile postedFile = files[iFile];
用for循环就不会,晕
#17
我也是2.0环境,没办法,也许真是人品问题了
#18
这可咋办啊,.NET出Bug了?
#19
可能是BUG
#20
msdn:http://msdn.microsoft.com/en-us/library/ttw7t8t6.aspx
The foreach statement repeats a group of embedded statements for each element in an array or an object collection that implements the System.Collections..::.IEnumerable or ......
HttpFileCollection应该没有实现IEnumerable接口吧!
The foreach statement repeats a group of embedded statements for each element in an array or an object collection that implements the System.Collections..::.IEnumerable or ......
HttpFileCollection应该没有实现IEnumerable接口吧!
#21
所以还是建议你用for好了
#22
应该是实现了啊,youbl 他说他不报错...真的不知道是什么原因了
#23
应该是没问题的,你可以断点调试到那一行看看file 和 allFiles都是什么类型的,是否有值
#24
up
#25
any time
#26
慢慢学习
PS:
我的目标是 ---->
^_^
PS:
我的目标是 ---->
^_^
#27
up
#28
allfile肯定是有值的,而file,根本都下不了foreach,file肯定是什么都没有了!应该算是微软一个bug吧!(可能我真的无法解释这种现象了)
#29
bug?只有人人都会出现的问题,才能称之为bug吧
你把你的项目打包,发出来给我看看
youbl@126.com
你把你的项目打包,发出来给我看看
youbl@126.com
#30
的确是不能foreach的,,大家可以看看 反编译 后的.net 2.0中的实现代码
#31
HttpFileCollection 继承自 NameObjectCollectionBase,而 NameObjectCollectionBase 的 GetEnumerator() 返回 NameObjectKeysEnumerator,NameObjectKeysEnumerator 的 Current 属性返回的是 String 类型的 Key,所以当 foreach 时,Request.Files 确实是一个 String 类型集合,的确不能转换成 HttpPostedFile,而 HttpFileCollection 的 this[] 返回的确是 HttpPostedFile 类型。
如果写成
foreach (string key in Request.Files)
{
HttpPostedFile file = Request.Files[key];
或者
HttpPostedFile file = Request.Files.Get(key);
...
}
就可以
真是奇怪啊,不能理解,如有高手看到,还望给予讲解,谢谢
如果写成
foreach (string key in Request.Files)
{
HttpPostedFile file = Request.Files[key];
或者
HttpPostedFile file = Request.Files.Get(key);
...
}
就可以
真是奇怪啊,不能理解,如有高手看到,还望给予讲解,谢谢
#32
给大家一个 准确的回答,是因为Upload不是服务器端控件。
大家知道怎么回事了吧,说到底MS的Bug
大家知道怎么回事了吧,说到底MS的Bug
#1
奇怪的是,那个叫什么思归的居然也这么写过,真是很奇怪了,难道以前可以?
#2
关注...
#3
HttpFileCollection allFiles = Request.Files;
想这样使用
foreach (HttpPostedFile file in allFiles) {
这样是没有问题的
你的“// 但是这里报错,说字符串不能转成HttpPostedFile ”
代码是什么?
想这样使用
foreach (HttpPostedFile file in allFiles) {
这样是没有问题的
你的“// 但是这里报错,说字符串不能转成HttpPostedFile ”
代码是什么?
#4
foreach (HttpPostedFile file in allFiles) { 这一行报错了
#5
foreach (HttpPostedFile file in allFiles) {
// 但是这里报错,说字符串不能转成HttpPostedFile
}
应该是你循环里的代码有错,是不是把file 赋值给一个字符串变量了?
foreach (HttpPostedFile file in allFiles) 这是没错的,仔细检查下代码
// 但是这里报错,说字符串不能转成HttpPostedFile
}
应该是你循环里的代码有错,是不是把file 赋值给一个字符串变量了?
foreach (HttpPostedFile file in allFiles) 这是没错的,仔细检查下代码
#6
学.NET来第一次遇到这种问题,因为见过它可以以数组形式方访问,所以就想试试foreach,结果试出问题了
#7
实现了IEnumerable和IEnumerator两个接口的数据结构都可以用foreach遍历
#8
foreach 应用于Collection,List<T>等的遍历
#9
谢谢楼上的回复!
查过了,确实是那个地方出问题了,如果改成
无法将类型为“System.String”的对象强制转换为类型“System.Web.HttpPostedFile”。
完整代码
查过了,确实是那个地方出问题了,如果改成
无法将类型为“System.String”的对象强制转换为类型“System.Web.HttpPostedFile”。
完整代码
public static string[] PutFileToFolder(HttpRequest request)
{
// 设置文件存放路径
string folderPath = HttpContext.Current.Server.MapPath(string.Format("~/{0}/{1}/", STORE_FILE_PATH, DateTime.Now.ToString("yyyyMM")));
// 文件不存在
if (System.IO.Directory.Exists(folderPath) == false)
System.IO.Directory.CreateDirectory(folderPath);
// 文件存放数组
ArrayList filelist = new ArrayList();
// 获取所有文件
HttpFileCollection allFiles = request.Files;
for (int i = 0; i < allFiles.Count; i++) // 这里不出错
{
}
foreach (HttpPostedFile myfiles in allFiles) { // 这里出错
}
////STORE_FILE_PATH
//string filePath = string.Empty;
//string fileExt = string.Empty;
//for (int i = 0; i < allFiles.Count; i++)
//{
// HttpPostedFile file = allFiles[i];
// // 空文件
// if (file.ContentLength == 0) continue;
// fileExt = System.IO.Path.GetExtension(file.FileName);
// // 设置文件路径,名字,后缀
// filePath = string.Format("{0}{1}{2}", folderPath, DateTime.Now.Ticks.ToString(), fileExt);
// // 保存文件
// file.SaveAs(filePath);
// // 将路径加入列表
// filelist.Add(filePath);
//}
return new string[] { };
}
#10
可以使用For
HttpPostedFile file = allFiles[i];
HttpPostedFile file = allFiles[i];
#11
IEnumerable这个已经被实现了,但是还是不能遍历,不知道是什么原因!高手解答
#12
在我这边
没有任何问题,不知道楼主问题出在哪。
HttpRequest req = this.Request;
HttpFileCollection allFiles = req.Files;
foreach (HttpPostedFile file in allFiles)
{
}
没有任何问题,不知道楼主问题出在哪。
#13
看MSDN上的一段话:
In C#, it is not strictly necessary for a collection class to inherit from IEnumerable and IEnumerator in order to be compatible with foreach; as long as the class has the required GetEnumerator, MoveNext, Reset, and Current members, it will work with foreach.
只要类实现了GetEnumerator, MoveNext, Reset, Current四个方法和属性就可以了,不一定说要实现IEnumerable 和IEnumerator 接口。而
HttpFileCollection 反射出来的结果为下面的内容
public sealed class HttpFileCollection : NameObjectCollectionBase
{......}
而NameObjectCollectionBase实现了ICollection, IEnumerable, ISerializable, IDeserializationCallback实现了四个接口,显然这符合foreach的要求.......
说类型不对,是因为Current属性的类型无法转换为要求的类型,你可以试试把string换成HttpPostedFile看看,我看应该可以了。
In C#, it is not strictly necessary for a collection class to inherit from IEnumerable and IEnumerator in order to be compatible with foreach; as long as the class has the required GetEnumerator, MoveNext, Reset, and Current members, it will work with foreach.
只要类实现了GetEnumerator, MoveNext, Reset, Current四个方法和属性就可以了,不一定说要实现IEnumerable 和IEnumerator 接口。而
HttpFileCollection 反射出来的结果为下面的内容
public sealed class HttpFileCollection : NameObjectCollectionBase
{......}
而NameObjectCollectionBase实现了ICollection, IEnumerable, ISerializable, IDeserializationCallback实现了四个接口,显然这符合foreach的要求.......
说类型不对,是因为Current属性的类型无法转换为要求的类型,你可以试试把string换成HttpPostedFile看看,我看应该可以了。
#14
我的.net环境是2.0,不知道是不是版本不合的原因。我这边是出问题了。呵呵!
#15
现在的场合很简单了,我改了代码
前台aspx
<div id="divFilesPanel">
<ul>
<li><asp:FileUpload ID="myfile" runat="server" /></li>
</ul>
<div><input type="button" id="addUploadFile" value="添加上传控件" /> <asp:Button ID="btnUploadFile" runat="server" Text="开始上传" OnClick="btnUploadFile_Click" /></div>
</div>
后台cs
protected void btnUploadFile_Click(object sender, EventArgs e)
{
foreach (HttpPostedFile file in Request.Files)// 无法将类型为“System.String”的对象强制转换为类型“System.Web.HttpPostedFile”。
{ }
// WebUtility.PutFileToFolder(Request);
}
还出那个问题!
前台aspx
<div id="divFilesPanel">
<ul>
<li><asp:FileUpload ID="myfile" runat="server" /></li>
</ul>
<div><input type="button" id="addUploadFile" value="添加上传控件" /> <asp:Button ID="btnUploadFile" runat="server" Text="开始上传" OnClick="btnUploadFile_Click" /></div>
</div>
后台cs
protected void btnUploadFile_Click(object sender, EventArgs e)
{
foreach (HttpPostedFile file in Request.Files)// 无法将类型为“System.String”的对象强制转换为类型“System.Web.HttpPostedFile”。
{ }
// WebUtility.PutFileToFolder(Request);
}
还出那个问题!
#16
无法将类型为“System.String”的对象强制转换为类型“System.Web.HttpPostedFile”。
我刚才试了一下也报这个错,
for(int iFile = 0; iFile < files.Count; iFile++)
{
/**////'检查文件扩展名字
HttpPostedFile postedFile = files[iFile];
用for循环就不会,晕
我刚才试了一下也报这个错,
for(int iFile = 0; iFile < files.Count; iFile++)
{
/**////'检查文件扩展名字
HttpPostedFile postedFile = files[iFile];
用for循环就不会,晕
#17
我也是2.0环境,没办法,也许真是人品问题了
#18
这可咋办啊,.NET出Bug了?
#19
可能是BUG
#20
msdn:http://msdn.microsoft.com/en-us/library/ttw7t8t6.aspx
The foreach statement repeats a group of embedded statements for each element in an array or an object collection that implements the System.Collections..::.IEnumerable or ......
HttpFileCollection应该没有实现IEnumerable接口吧!
The foreach statement repeats a group of embedded statements for each element in an array or an object collection that implements the System.Collections..::.IEnumerable or ......
HttpFileCollection应该没有实现IEnumerable接口吧!
#21
所以还是建议你用for好了
#22
应该是实现了啊,youbl 他说他不报错...真的不知道是什么原因了
#23
应该是没问题的,你可以断点调试到那一行看看file 和 allFiles都是什么类型的,是否有值
#24
up
#25
any time
#26
慢慢学习
PS:
我的目标是 ---->
^_^
PS:
我的目标是 ---->
^_^
#27
up
#28
allfile肯定是有值的,而file,根本都下不了foreach,file肯定是什么都没有了!应该算是微软一个bug吧!(可能我真的无法解释这种现象了)
#29
bug?只有人人都会出现的问题,才能称之为bug吧
你把你的项目打包,发出来给我看看
youbl@126.com
你把你的项目打包,发出来给我看看
youbl@126.com
#30
的确是不能foreach的,,大家可以看看 反编译 后的.net 2.0中的实现代码
#31
HttpFileCollection 继承自 NameObjectCollectionBase,而 NameObjectCollectionBase 的 GetEnumerator() 返回 NameObjectKeysEnumerator,NameObjectKeysEnumerator 的 Current 属性返回的是 String 类型的 Key,所以当 foreach 时,Request.Files 确实是一个 String 类型集合,的确不能转换成 HttpPostedFile,而 HttpFileCollection 的 this[] 返回的确是 HttpPostedFile 类型。
如果写成
foreach (string key in Request.Files)
{
HttpPostedFile file = Request.Files[key];
或者
HttpPostedFile file = Request.Files.Get(key);
...
}
就可以
真是奇怪啊,不能理解,如有高手看到,还望给予讲解,谢谢
如果写成
foreach (string key in Request.Files)
{
HttpPostedFile file = Request.Files[key];
或者
HttpPostedFile file = Request.Files.Get(key);
...
}
就可以
真是奇怪啊,不能理解,如有高手看到,还望给予讲解,谢谢
#32
给大家一个 准确的回答,是因为Upload不是服务器端控件。
大家知道怎么回事了吧,说到底MS的Bug
大家知道怎么回事了吧,说到底MS的Bug