1

ASP.NET MVC3 アプリケーションがあり、画像ファイル (png、jpeg、gif など) に link_to したいのですが、ユーザーがそれをクリックすると、ブラウザーに表示されるのではなく、ファイルがダウンロードされます。これを行う方法はありますか?

4

4 に答える 4

3

あなたのリンクを次のようにしてください:

@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

于 2011-08-02T17:50:52.970 に答える
0

技術的には、ブラウザがダウンロードしています。

画像に直接リンクして、ブラウザにダウンロードを促すことはできないと思います。

画像に直接リンクする代わりに、おそらくzipファイルで画像を提供するページにリンクする何かを試すことができます-もちろん、ダウンロードが発生するように促します.

于 2011-08-02T17:36:01.313 に答える
0

はい、できます。

ここで、ニーズに合わせてこれをカスタマイズする必要がありますが、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"

そして、関連ファイルがダウンロードされます。

于 2011-08-02T17:45:45.773 に答える
-1

これは可能ではないと思いますが、右クリックして画像を保存するという簡単なメッセージで十分だと思います。

于 2011-08-02T17:40:05.987 に答える