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

Я пишу веб-приложение в ASP.net.

Я пытаюсь открыть диалоговое окно для загрузки файлов с сервера.

У меня есть соответствующие данные файла, хранящиеся в переменной с именем file.

Файл имеет поля: FileType - MIMEType файла
FilePath - путь к файлу на стороне сервера

Вот код на данный момент:

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.

4 ответа

Решение

См редактировать в первом посте.

Удалена панель обновления Ajax для устранения ошибки. Панель остановила запись обратно на сервер.

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

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

ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(Button);

Попробуйте изменить

Response.AppendHeader("Content-Disposition", "attachment; filename=" +     GetFileName(file));

к

Response.AppendHeader("Content-Disposition", "attachment; filename=" +     Path.GetFileName(GetFileName(file))));

Если это не сработает, вы всегда можете использовать Response.BinaryWrite или Resonse.Write для потоковой передачи файла в веб-браузер. Вот как передать файл с помощью Response.Write или Response.BinaryWrite. Поместите эти функции в библиотеку, затем вызывайте их по мере необходимости

 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.");

Использование Response.WriteFile() вместо.

Кроме того, не используйте Response.End()! Это прерывает поток. использование Response.Flush(); Response.Close();

Другие вопросы по тегам