3

我在下面有一个扩展方法,但是当我运行它时,foreach 给了我InvalidCastException,它说 *

无法将“System.String”类型的对象转换为“System.Web.HttpPostedFile”类型。

代码 :

public static List<Attachment> GetFiles(this HttpFileCollection collection) {
            if (collection.Count > 0) {
                List<Attachment> items = new List<Attachment>();
                foreach (HttpPostedFile _file in collection) {
                    if (_file.ContentLength > 0)
                        items.Add(new Attachment()
                        {
                            ContentType = _file.ContentType,
                            Name = _file.FileName.LastIndexOf('\\') > 0 ? _file.FileName.Substring(_file.FileName.LastIndexOf('\\') + 1) : _file.FileName,
                            Size = _file.ContentLength / 1024,
                            FileContent = new Binary(new BinaryReader(_file.InputStream).ReadBytes((int)_file.InputStream.Length))
                        });

                    else
                        continue;
                }
                return items;
            } else
                return null;
        }

提前致谢。

MSDN 说:

客户端对文件进行编码并使用多部分 MIME 格式在内容正文中传输它们,HTTP Content-Type 标头为 multipart/form-data。ASP.NET 将编码文件从内容主体中提取到 HttpFileCollection 的各个成员中。HttpPostedFile 类的方法和属性提供对每个文件的内容和属性的访问。

4

4 回答 4

7

如果您查看此页面上的代码示例,它会显示您应该如何枚举集合,实际上当您尝试按原样枚举时会得到一个字符串。

http://msdn.microsoft.com/en-us/library/system.web.httpfilecollection.aspx

于 2009-12-15T06:54:58.930 回答
3

HttpFileCollection集合枚举器返回键。您需要在循环的每次迭代中使用键来查找关联的HttpPostedFile对象。所以你的循环需要看起来像这样:

foreach (string name in collection) {
    HttpPostedFile _file = collection[name];
    // ...rest of your loop code...
}
于 2009-12-15T06:58:12.297 回答
1

好吧,我找到了一个解决方案,但它看起来很愚蠢,但它确实有效。

我只是foreach用这个改变了:

foreach (string fileString in collection.AllKeys) {
                    HttpPostedFile _file = collection[fileString];
                    if (_file.ContentLength > 0)

                        items.Add(new Attachment()
                        {
                            ContentType = _file.ContentType,
                            Name = _file.FileName.LastIndexOf('\\') > 0 ? _file.FileName.Substring(_file.FileName.LastIndexOf('\\') + 1) : _file.FileName,
                            Size = _file.ContentLength / 1024,
                            FileContent = new Binary(new BinaryReader(_file.InputStream).ReadBytes((int)_file.InputStream.Length))
                        });

                    else
                        continue;
                }
于 2009-12-15T06:57:57.743 回答
1
HttpFileCollection hfc = Request.Files;
  for (int i = 0; i < hfc.Count; i++)
  {
     HttpPostedFile hpf = hfc[i];
     if (hpf.ContentLength > 0)
    {
     string _fileSavePath = _DocPhysicalPath  + "_" + hpf.FileName;
    }
  }
于 2013-01-31T13:39:53.257 回答