2010-09-27 4 views
3

Я пытаюсь вызвать Response.TransmitFile(), чтобы запросить загрузку. Я прочитал несколько постов по этому вопросу и на основе моего метода от блог Рика Стрэхл в http://www.west-wind.com/weblog/posts/76293.aspxИспользование Response.TransmitFile для физического файла не работает

Единственного различие (что я могу сказать), что я ориентируюсь на физический файл вне виртуального каталога. Этот код вызывается в ajaxified radgrid ... Интересно, не работает ли response.transmitfile с ajax-вызовами? Вот мой фрагмент кода:

  // Get the physical Path of the file 
      string docFilePath = (string)args.AttachmentKeyValues["DocFilePath"]; 

      // Create New instance of FileInfo class to get the properties of the file being downloaded 
      FileInfo file = new FileInfo(docFilePath); 

      // Checking if file exists 
      if (file.Exists) 
      { 
       Response.ClearContent(); 

       Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name); 


       Response.AddHeader("Content-Length", file.Length.ToString()); 


       Response.ContentType = ReturnExtension(file.Extension.ToLower()); 


       Response.TransmitFile(file.FullName); 

       Response.End(); 
      } 

См системы знает, что файл существует ... он получает через к Response.End() без ошибок ... затем продолжает приложение правильно ... За исключением есть нет приглашения скачать.

Метод ReturnExtension снимается с другого сайта (жаль, что я не могу вспомнить, где!) Следующим образом

string ReturnExtension(string fileExtension) 
    { 
     // In the long run this should go in a class 
     switch (fileExtension) 
     { 
      case ".htm": 
      case ".html": 
      case ".log": 
       return "text/HTML"; 
      case ".txt": 
       return "text/plain"; 
      case ".doc": 
       return "application/ms-word"; 
      case ".tiff": 
      case ".tif": 
       return "image/tiff"; 
      case ".asf": 
       return "video/x-ms-asf"; 
      case ".avi": 
       return "video/avi"; 
      case ".zip": 
       return "application/zip"; 
      case ".xls": 
      case ".csv": 
       return "application/vnd.ms-excel"; 
      case ".gif": 
       return "image/gif"; 
      case ".jpg": 
      case "jpeg": 
       return "image/jpeg"; 
      case ".bmp": 
       return "image/bmp"; 
      case ".wav": 
       return "audio/wav"; 
      case ".mp3": 
       return "audio/mpeg3"; 
      case ".mpg": 
      case "mpeg": 
       return "video/mpeg"; 
      case ".rtf": 
       return "application/rtf"; 
      case ".asp": 
       return "text/asp"; 
      case ".pdf": 
       return "application/pdf"; 
      case ".fdf": 
       return "application/vnd.fdf"; 
      case ".ppt": 
       return "application/mspowerpoint"; 
      case ".dwg": 
       return "image/vnd.dwg"; 
      case ".msg": 
       return "application/msoutlook"; 
      case ".xml": 
      case ".sdxl": 
       return "application/xml"; 
      case ".xdp": 
       return "application/vnd.adobe.xdp+xml"; 
      default: 
       return "application/octet-stream"; 
     } 
    } 

ответ

2

Эта проблема заключается в том, что я не могу выполнить Response.TransmitFile() из вызова AJAX. После прочтения нескольких блогов я использую async postback для установки src невидимого iframe. Затем iframe отправляет файл в событие загрузки.

0

Я предположил бы, что код делает передачи не имеет права открыть этот файл. Вы можете вызвать TransmitFile с уже открытым файлом? Это должно работать лучше.

+0

Если код не имеет прав на файл, не будет ли проблема с файлом.exist иметь проблему? – Matthew

+0

@Matthew PK: Не обязательно. Из того, что я помню о файле передачи, он не отправляет файл из потока, обрабатывающего ответ, но используя async IO. (Что-то низкоуровневое, как поток ядра, открывающий файл и перетаскивая данные непосредственно в сокет). Проверка доступа выполняется, когда вы открываете дескриптор, поэтому, если вы можете выйти за пределы этой точки, txfile должен уметь делать все остальное. – 2010-09-27 19:56:37

 Смежные вопросы

  • Нет связанных вопросов^_^