###初めに
ASP.NETで、ある特定のディレクトリを取得し、そのディレクトリ内のファイルの数だけセルを作り、そのセル、またはセル内の文字がクリックされたら、イベントを起こすことができる方法を教えていただきたいと考えています。
元々は、私はユーザーが選択したファイルの中身の文章を、ブラウザに表示できるような仕組みを実装することを目的としていました。しかし、その後に構築しようと考えているシステムの内容が少し変わり、「ファイルの中身をブラウザに表示する」機能をを「ファイル自体をダウンロードする」ことに方向転換することになりました。方向転換する前のシステムを構築するためにも質問をしており、こちらに載せております。
###前提・実現したいこと
ある特定のディレクトリの中にいくつかのディレクトリがあり、さらにその中にいくつかのフォルダが入ってあります。それらを表(Table)として表し、それぞれのフォルダの名前がセル内に文字で書かれています。そして、そのセル、またはセル内の文字をクリックすることで、そのフォルダをダウンロードできる機能をつけることになりました。
そこで、行け!偏差値40プログラマー [ ASP.NET ] ファイルのアップロードとダウンロード ( FileUpload / HttpResponse.TransmitFile )というサイトを参考にして、ファイルのダウンロードを行える仕組みを考えました。以下に示すコードは一例で、FileUploadでダウンロードするフォルダを決め、ボタンを押すとそのフォルダのダウンロードを行えるというコードで、表は特定のディレクトリ中のフォルダを示すだけの状態なのですが、これを「特定のディレクトリ中のフォルダTable1内のセルに書かれたフォルダをクリックしたら、そのフォルダをダウンロードできる」ようなコードにすることは可能でしょうか。お手数ですが、よろしくお願いします。
###該当のソースコード
Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:Table ID="Table1" runat="server"> </asp:Table> <asp:FileUpload ID="FileUpload1" runat="server" /> <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" /> </div> </form> </body> </html>
Default.aspx.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.IO; using System.Text; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { cppTable(); } protected void Button1_Click(object sender, EventArgs e)//フォルダをダウンロードする部分、ここの箇所を、Tableのセル内の文字がクリックされたら行われるようにしてほしい { // ファイルがアップロードされていなければリターン if (FileUpload1.HasFile == false) { return; } // ファイルをメモリーに格納 Byte[] data = new Byte[FileUpload1.PostedFile.ContentLength]; FileUpload1.PostedFile.InputStream.Read(data, 0, FileUpload1.PostedFile.ContentLength); // レスポンスを作成して返す(アップロードされたファイルをそのままダウンロード) HttpResponse resp = HttpContext.Current.Response; resp.Clear(); resp.ContentType = FileUpload1.PostedFile.ContentType; // コンテントタイプ resp.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(FileUpload1.FileName)); resp.BinaryWrite(data); } public void cppTable() { //ディレクトリ内のフォルダの数だけ表の列を増やす IEnumerable<string> subFolders = System.IO.Directory.EnumerateDirectories(@"C:「特定のディレクトリ」", "*", System.IO.SearchOption.AllDirectories).Select(Path.GetFileName); // ファイルパスからファイル名を抽出 TableRow tableRow; TableCell tableCell; foreach (string f in subFolders) //ここで行を作っていく { tableRow = new TableRow(); tableCell = new TableCell(); tableCell.Text = f; tableRow.Cells.Add(tableCell); IEnumerable<string> Qfiles = System.IO.Directory.EnumerateFiles(@"C:「特定のディレクトリ」" + f, "*", System.IO.SearchOption.AllDirectories).Select(Path.GetFileName); foreach (string f2 in Qfiles) { tableCell = new TableCell(); tableCell.Text = f2; HyperLink hl = new HyperLink(); hl.Text = tableCell.Text; string winPath = @"C:「特定のディレクトリ」+ f + "\\" + f2; Uri u = new Uri(winPath); if (u.IsFile) { hl.NavigateUrl = winPath; tableCell.Controls.Add(hl); } tableRow.Cells.Add(tableCell); } Table1.Rows.Add(tableRow); } } }
回答1件
あなたの回答
tips
プレビュー