ASP.Net Передача файла

#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 для устранения ошибки. Панель останавливала отправку сообщения обратно на сервер.

Для получения дополнительной информации см. Комментарий Криса Валенсуэлы.