ASP.NET MVC3 アプリケーションがあり、画像ファイル (png、jpeg、gif など) に link_to したいのですが、ユーザーがそれをクリックすると、ブラウザーに表示されるのではなく、ファイルがダウンロードされます。これを行う方法はありますか?
4 に答える
あなたのリンクを次のようにしてください:
@Html.ActionLink(
"Download Image", // text to show
"Download", // action name
["DownloadManager", // if need, controller]
new { filename = "my-image", fileext = "jpeg" } // file-name and extension
)
アクションメソッドは次のとおりです。
public FilePathResult Download(string filename, string fileext) {
var basePath = Server.MapPath("~/Contents/Images/");
var fullPath = System.IO.Path.Combine(
basePath, string.Concat(filename.Trim(), '.', fileext.Trim()));
var contentType = GetContentType(fileext);
// The file name to use in the file-download dialog box that is displayed in the browser.
var downloadName = "one-name-for-client-file." + fileext;
return File(fullPath, contentType, downloadName);
}
private string GetContentType(string fileext) {
switch (fileext) {
case "jpg":
case "jpe":
case "jpeg": return "image/jpeg";
case "png": return "image/x-png";
case "gif": return "image/gif";
default: throw new NotSupportedException();
}
}
更新: 実際、ファイルがブラウザに送信されると、このキー/値がhttp-headerで生成されます。
Content-Disposition: attachment; filename=file-client-name.ext
これfile-client-name.ext
は、クライアント システムでファイルを名前を付けて保存するname.extensionです。たとえば、ASP.NET (none mvc) でこれを行いたい場合は、HttpHandlerを作成し、ファイル ストリームをResponseに書き込み、上記のキー/値をhttp-headerに追加するだけです。
Response.Headers.Add("Content-Disposition", "attachment; filename=" + "file-client-name.ext");
これだけ、お楽しみください:D
技術的には、ブラウザがダウンロードしています。
画像に直接リンクして、ブラウザにダウンロードを促すことはできないと思います。
画像に直接リンクする代わりに、おそらくzipファイルで画像を提供するページにリンクする何かを試すことができます-もちろん、ダウンロードが発生するように促します.
はい、できます。
ここで、ニーズに合わせてこれをカスタマイズする必要がありますが、FileController
ファイルを識別子で返す を作成しました (名前で簡単に返すことができます)。
public class FileController : Controller
{
public ActionResult Download(string name)
{
// check the existence of the filename, and load it in to memory
byte[] data = SomeFunctionToReadTheFile(name);
FileContentResult result = new FileContentResult(data, "image/jpg"); // or whatever it is
return result;
}
}
さて、そのファイルをどのように読み取るか、どこから取得するかはあなた次第です。次に、次のようなルートを作成しました。
routes.MapRoute(null, "files/{name}", new { controller = "File", action = "Download"});
私のデータベースにはファイルへの識別子のマップがあります (実際にはこれよりも複雑ですが、簡潔にするためにそのロジックを省略しています)、次のような URL を記述できます。
"~/files/somefile"
そして、関連ファイルがダウンロードされます。
これは可能ではないと思いますが、右クリックして画像を保存するという簡単なメッセージで十分だと思います。