2009-12-27 4 views
0

У меня есть приложение, которое создает аудиофайл. Мне нужно предоставить ссылку, которая вызывает диалог сохранения, когда вы звоните пользователям, чтобы сохранить файл.Разрешение пользователям скачивать файлы - ASP.NET

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

Response.ContentType = "audio/wav"; 
Response.AppendHeader("Content-Disposition", "attachment; filename=blah.wav"); 
Response.WriteFile(@"blah.wav"); 
Response.End(); 

Когда я добавить этот обработчик событий кнопки ссылки, я получаю ошибку:

"Line: 4723 
Error: Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled. 
Details: Error parsing near 'RIFF?WAVEfmt '." 

Итак, я решил попробовать, создав промежуточную страницу, которая облегчает загрузку. В обработчике загрузки linkbutton я добавил Respose.Redirect на эту промежуточную страницу и на странице PageLoad страницы, я добавил фрагмент кода выше. При настройке таким образом IE блокирует загрузку, говоря:

"To help protect your security, Internet Explorer blocked his site from downloading files to your computer. Click here for options" Когда я нажимаю и выбираю «Загрузить файл», я не получаю диалог «Сохранить».

Мои вопросы: 1. Могу ли я удалить промежуточную страницу? 2. Если я не могу, как у меня нет запроса IE, пользователь должен действовать?

+0

Что такое линия на линии * Линия: 4723 *? –

+0

Это ошибка ajax (у меня есть эта страница в UpdatePanel) – Nick

+0

Я думаю, именно поэтому проблема возникает, попробуйте переместить кнопку/обработчик за панель и она будет работать. Нет необходимости в ajax, так как браузер не покинет страницу в любом случае из-за вложения. –

ответ

1

Возможно, ваш Response содержит что-то перед ударом вашего кода, вы попробовали Response.Clear() перед выводом чего-нибудь?

Также не должно быть Response.Write после вашего Response.End().

Это исправит первую ошибку и устранит необходимость в промежуточной странице.

Я уже сделал это раньше, поэтому я не вижу ограничений.

Попробуйте найти то, что изменяет Response.

Благодаря

+0

Где добавить Response.Clear()? Это befoe Response.ContentType? – Nick

+0

Да, прежде чем что-либо делать! –

+0

Добавление Response.Clear() не имеет значения – Nick

0

Только предположение, но ваша проблема может быть из-за какого-либо типа MIME не установлен на сервере.

+0

Как это проверить? – Nick

+0

Проверить здесь MIME-типы http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/cd72c0dc-c5b8-42e4-96c2-b3c656f99ead.mspx?mfr=true – Myra

+0

Хорошо, если я перейду к промежуточная страница напрямую (для тестирования, открыла этот pge непосредственно в браузере), все работает так, как ожидалось. Я вижу диалог сохранения и могу загрузить/открыть wav-файл. Это заставляет меня думать, что этот тип MIME установлен на сервере. Нет? – Nick

1
Response.Clear(); 
      Response.ContentType = "audio/x-wav"; 
      Response.AddHeader("Content-Disposition", "attachment;filename=blah.wav"); 
      Response.WriteFile(@"blah.wav"); 
      Response.Flush(); 
      Response.End(); 

Я считаю, что вам недоставало двух частей: Clear() и Flush().

Я использовал этот точный код раньше.

В качестве примечания, возможно, вам придется использовать Response.BinaryWrite вместо Response.WriteFile.

1
protected void Button1_Click(object sender, EventArgs e) 
{ 
    String FileName1 = "test.mp3"; 

    String FilePath1 = "~/audio/test.mp3"; 


    String FileName = "FileName1"; 
    String FilePath = FilePath1; 
    System.Web.HttpResponse response = System.Web.HttpContext.Current.Response; 
    response.ClearContent(); 
    response.Clear(); 
    response.ContentType = "text/plain"; 
    response.AddHeader("Content-Disposition", "attachment; filename=" + FileName + ";"); 
    response.TransmitFile(FilePath); 
    response.Flush(); 
    response.End(); 
} 
<asp:Button ID="Button1" runat="server" Text="DownLoad" 
     onclick="Button1_Click" /> 
Смежные вопросы