如何用資料聯繫控制項來下載檔案

剛剛看到小舖有一個問題就是需要時做一個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)會比較理想