我如何从数组中获取fileupload属性

时间:2013-03-21 13:03:48

标签: c# asp.net

我将上传的文件保存在数组中,并在网格视图中显示。现在我在从数组中获取文件名,文件大小,文件类型,文件数据(二进制)等值时遇到问题。定义数组并添加上传的文件后,我尝试使用下面的代码,但它不显示文件变量的属性。 例如,我想获取上传文件的二进制数据(prjd.Data = file.FileBytes; )使用以下代码,但它不起作用。

public static ArrayList Files = new ArrayList();
foreach (var file in Files)
{


    ProjDocAttach prjd = new ProjDocAttach();
    prjd.ProjDocID = _Projectid;

    prjd.Data = file.FileBytes;

    _DataContext.ProjDocAttaches.InsertOnSubmit(prjd);
    _DataContext.SubmitChanges();
}

添加到文件数组的另一部分代码:

dt = new DataTable();

DataColumn dc1 = new DataColumn("File Name", typeof(string));

DataColumn dc2 = new DataColumn("File Size", typeof(string));

DataColumn dc3 = new DataColumn("Content Type", typeof(string));


dt.Columns.Add(dc1);

dt.Columns.Add(dc2);
dt.Columns.Add(dc3);

dr = dt.NewRow();

dr["File Name"] = FileName;

if (size > 0)
    dr["File Size"] = size.ToString() + " KB";
else
{ dr["File Size"] = fileObj.Length.ToString() + " Bytes"; }

dr["Content Type"] = contenttype;
//  dr["Bytes"] = bytes;
// var x = bytes;
//  var y = dr["Bytes"];
dt.Rows.Add(dr);
GridViewEfile.DataSource = dt;
GridViewEfile.DataBind();
Files.Add(FileUpload1);

2 个答案:

答案 0 :(得分:0)

ArrayList是一个对象数组,因此无需在循环中将file转换为System.IO.File,您将无法访问这些属性。你没有提到你正在使用哪个版本的.NET,但假设它是远程最近的版本,那么我建议使用泛型,用ArrayList替换List<System.IO.File>

答案 1 :(得分:0)

通过查看您的代码,我可以推断出您正在将整个文件上载控件添加到数组中。不要那样做!

您可以通过向数组添加您真正需要检索的属性(至少是您要检索的内容)来修复代码,这是文件字节。

我可以通过以下方式使其成功:

首先,我已将集合类型更改为List<byte[]>,此集合是强类型的,在这种情况下最好使用:

 public static List<byte[]> files = new List<byte[]>();

发布文件时,将FileBytes属性添加到列表中:

// FileUpload1 is the File Upload control declared at the aspx  
files.Add(FileUpload1.FileBytes);

要检索文件内容,请执行以下操作:

foreach (byte[] bytes in files)
{
    ProjDocAttach prjd = new ProjDocAttach();
    prjd.ProjDocID = _Projectid;
    prjd.Data = bytes;
    // Save to database
}

最后,我必须警告您使用公共静态属性来处理上传的文件。当您这样做时,您正在应用程序级别创建变量,因此所有用户都可以修改该列表,因为它是共享的。我不知道你想要完成什么,但这似乎是非常错误的。