如何制作可下载的图片文件?

时间:2011-08-02 17:32:14

标签: asp.net asp.net-mvc-3 download imagedownload

我有一个ASP.NET MVC3应用程序,我想链接到一个图像文件(png,jpeg,gif等),当用户点击它时,文件会下载,而不是浏览器显示它;有没有办法做到这一点?

4 个答案:

答案 0 :(得分: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 
)

和action-method在这里:

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(无mvc)中执行此操作,可以创建 HttpHandler ,将文件流写入响应,只需将上述键/值添加到 http-header

Response.Headers.Add("Content-Disposition", "attachment; filename=" + "file-client-name.ext");

就这样,享受:D

答案 1 :(得分:0)

从技术上讲,您的浏览器正在下载它。

我认为你不能直接链接到图像,并且浏览器提示下载。

你可以尝试一些东西,而不是直接链接到图像,你链接到一个页面,这可能会提供一个zip文件中的图像 - 这当然会促使下载发生。

答案 2 :(得分: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"});

我的数据库有一个标识符到文件的映射(它实际上比这更复杂,但我为了简洁省略了这个逻辑),我可以写下这样的网址:

 "~/files/somefile"

并下载相关文件。

答案 3 :(得分:-1)

我不认为这是可能的,但我认为右键单击保存图像的简单信息就足够了。