#asp.net #download #transmitfile
#asp.net #Скачать #передача файла
Вопрос:
Я пишу веб-приложение в ASP.net .
Я пытаюсь создать диалоговое окно файла для загрузки чего-либо с сервера.
У меня есть соответствующие данные файла, хранящиеся в переменной с именем file.
Файл содержит поля: FileType — Тип файла
— путь к файлу — Путь к файлу на стороне сервера
Вот код до сих пор:
Response.Clear();
Response.ContentType = file.FileType;
Response.AppendHeader("Content-Disposition", "attachment; filename=" GetFileName(file));
Response.TransmitFile(file.FilePath) ;
Response.End();
GetFileName — это функция, которая возвращает мне имя файла из объекта вложения. Я сохраняю только путь.
Приведенный выше код находится в функции с именем «Download_Clicked», которая представляет собой событие, которое запускается при нажатии. Событие сопоставляется кнопке LinkButton.
Проблема в том, что когда я запускаю приведенный выше код, ничего не происходит. Стандартное диалоговое окно не отображается.
Я попытался выполнить стандартное устранение неполадок, например, убедиться, что файл существует, и убедиться, что путь указан правильно. Они оба попали в точку.
Я предполагаю, что, поскольку моя машина также является сервером, она может каким-то образом неправильно обрабатываться.
Заранее спасибо.
Редактирование 1: попытка переноса элемента управления на другую страницу, работает нормально.
Редактирование 2: устранена проблема путем удаления элемента управления с панели обновления AJAX.
Комментарии:
1. Известен ли IIS тип mime? вы пробовали использовать «application / octet-stream»?
2. Я попробовал использовать MIME-тип octet-stream, и он все еще не работает.
3. Панели обновления Ajax плохо работают с управлением загрузкой файлов или загрузкой файлов с помощью ответа. Библиотека MSAjax имеет встроенные меры безопасности, которые выдают ошибку при изменении потока ответов. Распространенным методом загрузки динамически сгенерированных файлов является временное сохранение данных файла в переменной сеанса, а затем перенаправление пользователя на страницу, которая специально просматривает эту переменную сеанса при загрузке страницы и отправляет файл в браузер. Вы также можете сделать это с помощью HTTP-обработчика или просто оставить элементы управления загрузкой / загрузкой файлов за пределами панелей обновления
Ответ №1:
Я нашел другой способ сделать это, не удаляя панель обновления. Поместите приведенный ниже код при загрузке страницы, и теперь вы сможете использовать эту кнопку для запуска загрузки.
ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(Button);
Ответ №2:
Используйте Response.WriteFile()
вместо этого.
Кроме того, не используйте Response.End()
! Это прерывает поток. Использование Response.Flush(); Response.Close();
Комментарии:
1. Я попытался использовать ответ. Запись файла. Необычно то, что я взял элемент управления и перебросил его на другую страницу, и он работал нормально. Но это не будет работать на начальной странице, на которую я его поместил.
2.
Response.ContentType = file.FileType;
— тип содержимого — это тип содержимого MIME, а не тип файла. Вы можете найти в Google список распространенных типов контента, соответствующих файлу, который вы отправляете клиенту. Убедитесь, что ваша «сломанная» страница не отправляет никаких заголовков — как только они будут отправлены клиенту, вы не сможете повторно отправить их.3. Файл. Тип файла — это MIME-тип файла. Он используется только для вывода. Это единственная функция, которая отправляет что-то клиенту, на странице нет ничего другого, что отправляет материал.
Ответ №3:
Попробуйте изменить
Response.AppendHeader("Content-Disposition", "attachment; filename=" GetFileName(file));
Для
Response.AppendHeader("Content-Disposition", "attachment; filename=" Path.GetFileName(GetFileName(file))));
Если это не сработает, вы всегда можете использовать Response .Двоичная запись или резонанс.Запись для потоковой передачи файла в веб-браузер
Вот как передать файл с помощью ответа.Запись или ответ.Двоичная запись. Поместите эти функции куда-нибудь в библиотеку, а затем вызывайте их по мере необходимости
public void SendFileToBrowser(String FileName, String MIMEType, String FileData)
{
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" FileName);
Response.ContentType = MIMEType;
Response.Buffer = true;
Response.Write(FileData);
Response.End();
}
public void SendFileToBrowser(String FileName, String MIMEType, Byte[] FileData)
{
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" FileName);
Response.ContentType = MIMEType;
Response.Buffer = true;
Response.BinaryWrite(FileData);
Response.End();
}
Затем где-то вы вызываете эти функции следующим образом
SendFileToBrowser("FileName.txt", "text/plain", "Don't try this from an Update Panel. MSAjax does not like it when you mess with the response stream.");
Комментарии:
1. Извините, это тоже не исправило. По-прежнему ничего не получаю.
2. Я добавил ответ. Запись и ответ. Методы двоичной записи для передачи файла
Ответ №4:
См. Редактирование в первоначальном сообщении.
Удалена панель обновления Ajax для устранения ошибки. Панель останавливала отправку сообщения обратно на сервер.
Для получения дополнительной информации см. Комментарий Криса Валенсуэлы.