剛剛看到小舖有一個問題就是需要時做一個GridView來做檔案列表提供檔案下載
而檔案名稱並沒有在database中另外設計一個table來紀錄…
這樣的問題
剛剛看到小舖有一個問題就是需要時做一個GridView來做檔案列表提供檔案下載
而檔案名稱並沒有在database中另外設計一個table來紀錄而是統一存放在/upload的目錄底下…
這樣的問題
如果可以用LINQ的話一切會非常的簡單
因為只需要作列表的動作,而內容又比較需要客制化
所以我會建議盡量用Repeater這種輕量化的控制項來處裡啦~
怎麼做呢?非常簡單
aspx的頁面這樣做
<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate>
<thead>
<tr>
<td>
檔名</td>
<td>
下載</td>
</tr>
</thead>
</HeaderTemplate>
<ItemTemplate>
<tbody>
<tr>
<td>
<%# Eval("Name")%>
</td>
<td>
<%# string.Format("<a href='/upload/{0}'>{0}</a>", Eval("Name"))%>
</td>
</tr>
</tbody>
</ItemTemplate>
</asp:Repeater>
cs的頁面這樣即可
string startFolder = Server.MapPath("~/upload/");
IEnumerable<System.IO.FileInfo> fileList = GetFiles(startFolder);
var queryMatchingFiles =
from file in fileList
where file.Extension == ".jpg"//最好是過濾一下副檔名啦
select new { file.Name };
Repeater1.DataSource = queryMatchingFiles;
Repeater1.DataBind();
GetFiles是直接拿微軟的sample來改的就好了
protected static IEnumerable<System.IO.FileInfo> GetFiles(string path) {
if (!System.IO.Directory.Exists(path))
throw new System.IO.DirectoryNotFoundException();
string[] fileNames = null;
List<System.IO.FileInfo> files = new List<System.IO.FileInfo>();
fileNames = System.IO.Directory.GetFiles(path, "*.*", System.IO.SearchOption.AllDirectories);
foreach (string name in fileNames) {
files.Add(new System.IO.FileInfo(name));
}
return files;
}
當然您可以把aspx中的
<a href='/upload/{0}'>{0}</a>
這段改成去連到您自己處裡檔案下載的handler(ashx)會比較理想