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

2 回答 2

0

ArrayList是一个对象数组,因此如果不file将循环转换为 a System.IO.File,您将无法访问这些属性。您没有提及您使用的是哪个版本的 .NET,但假设它是最近的东西,那么我建议使用泛型,替换ArrayListList<System.IO.File>.

于 2013-03-21T13:26:52.810 回答
0

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

您可以修复您的代码,方法是仅将您真正需要检索的属性添加到数组中(至少您向我们展示您正在检索的内容),即文件字节。

通过执行以下操作,我可以使其工作:

首先,我将集合类型更改为 a 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
}

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

于 2013-03-21T13:48:09.960 回答