2013-03-21 96 views
0

我将上传的文件保存在数组中,并且也显示在网格视图中。现在我在获取文件名,文件大小,文件类型,文件数据(二进制)等数值时遇到问题。在定义数组并添加上传文件之后,我尝试使用下面的代码,但它不显示文件变量的属性。 例如我喜欢用下面的代码获取上传文件(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); 
+0

您是否将整个'FileUpload'控件添加到数组? Files.Add(FileUpload1);在你发布的代码片段中,是否只有你需要文件字节的属性? – MarcusVinicius 2013-03-21 13:25:58

回答

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); 

检索文件的内容,执行FOLL由于:

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

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

+0

如果我还想要文件名和输入我必须做的事,我必须使用3个foreach? – masoud 2013-03-21 14:26:37

+0

不,在这种情况下,我建议你创建一个类来保存你的数据,具有byte [] FileBytes,'string Name'和'FileType'属性。然后,将''列为'List ',其中MyClass是您创建的类。所以,在每一次迭代中,你将拥有全部三个属性。 – MarcusVinicius 2013-03-21 14:34:43

+0

谢谢我使用清单并在20天后为我工作,我不知道如何保持这些属性。 – masoud 2013-03-25 18:17:35

0

ArrayList是对象的数组,所以没有在你的循环铸造fileSystem.IO.File您将无法访问这些属性。你没有提到你使用的是哪个版本的.NET,但假设它是最近的东西,那么我会推荐使用泛型,用List<System.IO.File>代替ArrayList