Загрузка файла после завершения страницы без перенаправления - PullRequest
1 голос
/ 03 июня 2009

Я пытаюсь сделать то же самое, как, например, на sourceforge. После того, как пользователь создает некоторые данные, я генерирую файл и хочу, чтобы он предлагался ему после загрузки страницы. Тем не менее, я почти ничего не знаю о javascript и простой копировальной пасте

< script type="text/javascript">
var download_url = "http://downloads.sourceforge.net/sourceforge/itextsharp/itextsharp-4.1.2-dll.zip?use_mirror=dfn";


function downloadURL() {
    if (download_url.length != 0 && !jQuery.browser.msie){
        window.location.href = download_url;
    }
}

jQuery(window).load(downloadURL);

< /script>

недостаточно. Для пользователя важно загрузить файл, так как это сделать?

Вопрос, связанный с предыдущим, - где хранить созданный мной файл? Однажды во время использования сервера разработки asp.net, а затем на реальном сервере iis? И как должен выглядеть этот адрес? Когда я попробовал

setTimeout("window.location.href='file://localhost/C:/Downloads/file.pdf'", 2000);

я ничего не получал, с http ошибка неизвестного адреса.

Ответы [ 5 ]

1 голос
/ 04 июня 2009

Вы можете создать свой собственный PdfResult, который расширяет ActionResult следующим образом:

public class PdfResult : ActionResult
{
    public byte[] Content { get; set; }
    public string FileName { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {
        var response = context.HttpContext.Response;
        response.AddHeader("content-disposition", "attachment; filename=" + this.FileName);
        response.AddHeader("content-length", this.Content.Length.ToString());
        response.ContentType = "application/pdf";

        using (MemoryStream memoryStream = new MemoryStream(this.Content))
        {
            memoryStream.WriteTo(response.OutputStream);
        }

        response.End();
    }

Тогда в своем действии вы можете просто вернуть файл следующим образом:

    public ActionResult Pdf(string param1...)
    {
        var content = GeneratePdf(); //etc
        var fileName = AssignFileName();

        return new PdfResult { Content = content, FileName = fileName + ".pdf" };
    }
1 голос
/ 03 июня 2009

См. Пример загрузки Haack . Это объясняет (я думаю) именно то, что вы собираетесь делать. За исключением того, что вы указали бы тайм-аут со ссылкой для действия загрузки.

1 голос
/ 03 июня 2009

На сервере вы должны установить расположение содержимого в заголовке ответа на «Вложение», как описано в эти ответы .

Если вы сделаете это, загрузка не повлияет на страницу, которая в данный момент отображается в браузере. Итак, если вы инициируете запрос в Javascript, который получает вложение, браузер оставит страницу в покое, и пользователь увидит окно сообщения с вопросом «Открыть / Сохранить / Отменить».

1 голос
/ 03 июня 2009

вы просите браузер пользователя найти файл на своем компьютере ... который вы пытаетесь сохранить там.

вы можете использовать что-то вроде:

window.location.href='http://www.yourServer.com/generatePDF.asp?whatever=whatever'

где http://www.yourServer.com/generatePDF.asp?whatever=whatever - это то, что генерирует pdf-файл для пользователя

0 голосов
/ 03 июня 2009

Пара разных вещей. Во-первых, поскольку вы используете MVC, создайте действие, которое фактически генерирует файл и возвращает его как FileResult . Файл может быть реальным файлом на сервере, но он также может быть создан динамически - скажем, в MemoryStream - и FileResult, созданный из этого. Установите для содержимого application / octet-stream или фактический тип файла, если он не будет отображаться в браузере с помощью плагина. Во-вторых, не генерируйте файл в действии, которое отображает страницу, а скорее вызывайте действие, которое генерирует FileResult из этой страницы, используя технику, на которую вы ссылаетесь (хотя похоже, что они делают что-то другое для IE). Если тип MIME не может быть отображен, он будет загружен.

public ActionResult GenerateFile( string value, int other )
{

   MemoryStream file = new MemoryStream();
   ...

   return File( file, "application/octet-stream" );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...