Как я могу отправить файл и страницу в ответе HTTP? - PullRequest
0 голосов
/ 29 августа 2009

У меня есть страница ASP.NET, где я создаю электронную таблицу Excel и отправляю ее в ответе (заголовок размещения содержимого). Эта часть отлично работает, но у меня есть кнопка, которая никогда не будет снова включена, потому что исходная страница не является частью ответа.

Вот функция, которую я использую:

Public Shared Sub WriteToResponse(ByVal theWorkBook As Workbook, ByVal FileName As String, ByVal resp As HttpResponse)
    Dim theStream As New System.IO.MemoryStream()
    theWorkBook.Save(theStream)

    Dim byteArr As Byte() = DirectCast(Array.CreateInstance(GetType(Byte), theStream.Length), Byte())

    theStream.Position = 0
    theStream.Read(byteArr, 0, CInt(theStream.Length))
    theStream.Close()

    resp.Clear()
    resp.AddHeader("content-disposition", "attachment; filename=" & FileName)
    resp.BinaryWrite(byteArr)
    resp.End()
End Sub

Я пытался не очищать ответ и использовать AppendHeader вместо AddHeader, но ответ по-прежнему содержит только файл.

Чего мне не хватает? Нужно ли использовать другой заголовок? Я нашел этот оставшийся без ответа вопрос на форумах ASP.NET ; звучит как моя проблема.

Ответы [ 2 ]

2 голосов
/ 29 августа 2009

Вы не можете. Вы можете подделать поведение, открыв всплывающее окно при нажатии на кнопку и попросив всплывающее окно открыть файл и опубликовать страницу обратно из JavaScript. Но таким образом вы эффективно создаете 2 запроса с 2 ответами.

обновление: если вы хотите отключить кнопку, когда они начинают загрузку, и включить ее, как только загрузка начнется, вы не сможете этого сделать, но вы можете использовать некоторые хитрости, чтобы она выглядела так. Когда они нажимают на кнопку загрузки, используйте JavaScript, чтобы отключить кнопку и создать всплывающее окно, которое запускает потоковую передачу файла. Когда функция filestreaming возвращает (WriteToResponse), установите некоторое значение в сеансе пользователя. Тем временем исходная страница опрашивает сервер, используя AJAX, чтобы увидеть, установлено ли значение сеанса. Если установлено, повторно активируйте кнопку и установите значение на пустое или ложное снова (таким образом, это работает во второй раз). Но это похоже на множество уловок.

но я думаю, что в этом случае лечение хуже, чем проблема. Я предполагаю, что вы хотите этого, потому что генерация файла занимает некоторое время, и вы не хотите, чтобы пользователи сбрасывали поток, нетерпеливо нажимая кнопку во время подготовки файла. Для этого я бы просто отобразил всплывающее сообщение на странице при нажатии кнопки, говорящее что-то вроде: «Ваша загрузка готовится. Это может занять минуту. Спасибо за ваше терпение. (Нажмите, чтобы отклонить это сообщение)»

2 голосов
/ 29 августа 2009

Вы не можете отправить файл и новую страницу в том же ответе.

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

...