回答編集履歴

1 追記追加

SurferOnWww

SurferOnWww score 8196

2016/12/09 13:48  投稿

追加情報の記載をありがとうございます。ただ、
> こちらに載せております。
の「こちら」のリンク先が前のスレッド https://teratail.com/questions/57543 ではなくて、このスレッドになってしまっていますので折を見て訂正お願いします。
ダウンロードする場合でも、前のスレッドで書いたとおり、IIS のワーカープロセスにダウンロードするファイル / フォルダに対するアクセス権(読み取り権限)を与えることが必須ということは理解されているでしょうか? それは後で考えて対処するということでもいいですが、何ともならないケースもありますのであらかじめ承知しておいてください。
とりあえず、今質問にアップされているコードをできる限り利用するということで案を書いておきます。(それをお勧めするわけではないです。それをベースに改善していくということで)
(1) Default.aspx の FileUpload と Button は不要なので削除。
(2) テーブルの各行に HyperLink に代えて Button を配置し、それをクリックするとファイルをダウンロードすることにする。
(3) そのために、Default.aspx.cs のコードの foreach (string f2 in Qfiles) のループの中で、HyperLink を Button に変更し、hl.NavigateUrl = winPath; とする代わりに Button.CommandArgument プロパティに winPath を設定し、Click イベントに Button1_Click メソッドをアタッチする。
(4) Button1_Click メソッドの中身を、CommandArgument プロパティからファイルパスを取得し、HttpResponse.TransmitFile メソッドを使ってファイルをダウンロードするように全面的に書き換える。その際注意すべきは以下の通りです:
(4-1) ブラウザによってファイルの種類を判断する方法が異なるので、Content-Disposition: ヘッダと Content-Type: ヘッダの両方を正しく指定しておくようにしてください。
(4-2) TransmitFile メソッドの直後に Response.End(); を書いて強制終了させてください。推奨されていませんが、それがないと不必要な <!DOCTYPE ... で始まる html コードも送信されてしまいますので。
(4-3) ファイル名に日本語(ASCII 文字以外)を使うと文字化けするので、とりあえず使わないようにしてテストしてください。
(4-3) ファイル名に日本語(ASCII 文字以外)を使うと文字化けするので、とりあえず使わないようにしてテストしてください。
************【2016/12/9 13:45 追記】************
下の私の 2016/12/09 13:18 のコメントで「回答欄に Button1_Click メソッドの実装例を追記しておきます」と書きましたが、それを以下に書きます。ファイル名はとりあえず ASCII 文字限定としてください。
```
protected void Button1_Click(object sender, EventArgs e)
{
   string fpath = ((Button)sender).CommandArgument;
   Response.Clear();
   Response.AppendHeader("Content-Disposition",
                         "attachment; filename=" + Path.GetFileName(fpath));
   Response.ContentType = "text/plain"; // C ソースのテキストファイルを想定
   Response.TransmitFile(fpath);
   Response.End();
}
```
うまく行かなかったら、以下の点を確認してください。
(1) fpath に cppTable メソッドで設定した winPath が取得できているか。
(2) ワーカープロセスは fpath で指定されるファイルの読み取り権限を持っているか。(開発マシンで、Visual Studio から IIS Express を使用して動かしている場合は、質問者さんが開発マシンにログインしたアカウントの権限になるはず。まずはその条件で試してみてください)
日本語のファイル名の対応は、話が非常に長くなるので、上記でダウンロードがうまくいったらこのスレッドはクローズし、新たに別のスレッドを立てて質問するようにしてください。
推奨されていない Response.End() を避ける方法についても、新たに別のスレッドを立てて質問するようにしてください。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る