2011-03-01 24 views
4

私は現在、(より具体的にはjarアーカイブから)ファイルをダウンロードできるコントローラを実装しようとしています。ファイルはディスクに保存され、データベースには保存されません。これまで私はこれを考え出しました。ASP.NET MVC 2サイトからファイルをダウンロード

public FilePathResult GetFile(String fileName) 
{  
    return File(Path.Combine(Server.MapPath("~/App_Data/Bundles"), fileName), "application/java-archive"); 
} 

この時点では、エラー処理の不具合などを気にしないでください。ファイルはこのようにダウンロードされますが、間違った名前が付けられます。たとえば、 "sample.jar"の代わりに、ファイルはコントローラの名前 "GetFile"(拡張子なし)を取得します。

私が間違っていることに関するアイデアはありますか?

+0

を使用してファイルのダウンロードオプションのために魔法のように動作し、このリンクをチェックしてください。 –

答えて

8

オーバーロードを使用すると、fileDownloadNameを指定できます。

return File(Path.Combine(Server.MapPath("~/App_Data/Bundles"), fileName), 
      "application/java-archive", 
      fileName); 
+0

ありがとう、完璧に働いた! –

1

Fileにはオーバーロードされたバージョンがあります。つまり、ファイル名に3番目の引数を追加する必要があります。

return File(Path.Combine(Server.MapPath("~/App_Data/Bundles"), fileName), 
     "application/java-archive", "putFileNamehere.extension"); 

ここで、putFileNamehere.extensionは、ファイルダウンロードダイアログでユーザーに表示されます。

2

ただディスクに格納されていて、なぜそれらを提供する以外に何もしていないのであれば、コントローラを使用してルーティングする理由は何ですか?たとえば、それらを~/Content/Bundlesに入れ、それらに直接リンクする必要があります。

これで、filenameパラメータの余分なエラー/セキュリティ処理についてすべてを心配する必要はありません。また、一般にApp_Dataから直接ファイルを提供するのは悪い習慣ですが、これは一般に共有されるべきではないファイルの場所であるためです。

+0

+1。実際に彼の質問に答えるのではなく、とにかく頼むのは良いです! –

+1

@ Craig-Stuntz技術的に彼は「私が間違ってやっていることに関するアイデアは? ;-) – jbtule

+0

良い点と正解です。しかし、時間の経過とともに、ファイル名の代わりにid-nrが要求されます。 –

関連する問題