我将上传的文件保存在数组中,并在网格视图中显示。现在我在从数组中获取文件名,文件大小,文件类型,文件数据(二进制)等值时遇到问题。定义数组并添加上传的文件后,我尝试使用下面的代码,但它不显示文件变量的属性。
例如,我想获取上传文件的二进制数据(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 :(得分: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
}
最后,我必须警告您使用公共静态属性来处理上传的文件。当您这样做时,您正在应用程序级别创建变量,因此所有用户都可以修改该列表,因为它是共享的。我不知道你想要完成什么,但这似乎是非常错误的。