Как сделать файл изображения загружаемым? - PullRequest
1 голос
/ 02 августа 2011

У меня есть приложение ASP.NET MVC3, и я хочу связать_ файл изображения (png, jpeg, gif и т. Д.), И когда пользователь нажимает на него, файл отправляется на загрузку, а не в браузере;Есть ли способ сделать это?

Ответы [ 4 ]

3 голосов
/ 02 августа 2011

возьмите свою ссылку примерно так:

@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-метод здесь:

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();
    }
}

UPDATE: фактически, когда файл отправляется в браузер, этот ключ / значение будет сгенерирован в http-header :

Content-Disposition: attachment; filename=file-client-name.ext

, который file-client-name.ext - это name.extension , для которого вы хотите сохранить файл как в клиентской системе; например, если вы хотите сделать это в ASP.NET (нет mvc), вы можете создать HttpHandler , записать file-stream в Response , и просто добавьте указанный выше ключ / значение в http-header :

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

только это, наслаждайтесь: D

0 голосов
/ 02 августа 2011

Я не думаю, что это возможно, но мне кажется, что достаточно простого сообщения о том, что щелчок правой кнопкой мыши позволяет сохранить изображение.

0 голосов
/ 02 августа 2011

Да, вы можете.

Теперь вам нужно настроить это в соответствии с вашими потребностями, но я создал 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"

И соответствующий файл загружен.

0 голосов
/ 02 августа 2011

Ну, технически ваш браузер скачивает его.

Я не думаю, что вы можете напрямую ссылаться на изображение и получить запрос на загрузку в браузере.

Вы можете попробовать что-нибудь, где вместо прямой ссылки на изображение вы ссылаетесь на страницу, которая, возможно, отображает изображение в zip-файле - что, конечно, будет вызывать загрузку.

...