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

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

1 голос
/ 17 октября 2011

Я пишу веб-приложение в 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 ]

3 голосов
/ 07 ноября 2011

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

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

0 голосов
/ 17 октября 2011

Используйте Response.WriteFile() вместо.

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

0 голосов
/ 18 октября 2011

См. Редактирование в исходном сообщении.

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

Подробнее см. Комментарий Криса Валенсуэлы.

0 голосов
/ 17 октября 2011

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

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