2010-03-25 23 views
12

Estoy trabajando en una aplicación web y necesito transmitir varios archivos. Puedo hacer archivos PDF, imágenes y documentos de Office anteriores. Sin embargo, cuando trato de hacer con documentos de 2007, se rompe. Aquí está mi código:¿Cómo se transmite un archivo de Excel 2007 o Word 2007 utilizando asp.net y C#

Response.Buffer = true; 
    Response.Clear(); 
    Response.ClearContent(); 
    Response.ClearHeaders(); 
    switch (FileExtension.ToLower()) 
    { 
     case "pdf": 
      Response.ContentType = "application/pdf"; 
      break; 
     case "doc": 
      Response.ContentType = "application/msword"; 
      break; 
     case "docx": 
      Response.ContentType = "application/vnd.ms-word.document.12"; 
      break; 
     case "xls": 
      Response.ContentType = "application/vnd.ms-excel"; 
      break; 
     case "xlsx": 
      Response.ContentType = "application/vnd.ms-excel.12"; 
      break; 
     default: 
      Response.ContentType = "image/jpeg"; 
      break; 
    } 
    Response.BinaryWrite(buffer); 

El error que consigo es:

 
An invalid character was found in text content. Error processing resource 'http://DomainName/GetFile.aspx... 

PK 

¿Alguna sugerencia?

Respuesta

16

De acuerdo con una breve búsqueda en la web, los tipos MIME correctos para Word y Excel son:

application/vnd.openxmlformats-officedocument.wordprocessingml.document 
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet 

http://www.bram.us/2007/05/25/office-2007-mime-types-for-iis/

Editar:

El siguiente ejemplo simplificado funciona para mí. Es diferente de la suya ya que utiliza un controlador genérico en lugar de un formulario web (que es más apropiado para algo como esto de todos modos).

Para probarlo, asegúrese de que exista un archivo de Excel 2007 llamado Book1.xlsx en la carpeta de nivel superior de la aplicación.

DownloadSpreadsheet.ashx: 

<%@ WebHandler Language="C#" Class="DownloadSpreadsheetHandler" %> 

using System; 
using System.Web; 
using System.IO; 

public class DownloadSpreadsheetHandler: IHttpHandler { 

    public void ProcessRequest (HttpContext context) { 
     context.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
     string path = context.Server.MapPath("~/Book1.xlsx"); 
     using (FileStream spreadsheet = File.OpenRead(path)) 
     { 
      CopyStream(spreadsheet, context.Response.OutputStream); 
     } 
    } 

    public bool IsReusable { 
     get { 
      return false; 
     } 
    } 

    private static void CopyStream(Stream input, Stream output) 
    { 
     byte[] buffer = new byte[32768]; 
     while (true) 
     { 
      int read = input.Read(buffer, 0, buffer.Length); 
      if (read <= 0) 
       return; 
      output.Write(buffer, 0, read); 
     } 
    } 

} 
+0

Probé esto y es un poco mejor. Al menos estoy obteniendo el cuadro de diálogo abrir/guardar/cancelar. Sin embargo, si hago clic en abrir en un archivo docx, obtengo nada más que una página html en blanco. Si hago clic en guardar en el cuadro de diálogo, lo guardo en un archivo, luego lo abro, hago clic en algunos mensajes de error y luego obtengo el archivo correcto. Para los archivos xlsx, si guardo y luego abro, obtengo lo mismo que docx, es decir, algunos mensajes de error que se abren. Sin embargo, si hago clic en abrir en el archivo xlsx, tengo que hacer clic a través de algunos errores, luego Excel se abre, pero en lugar de los datos, tengo mi página de inicio de sesión – Kevin

+0

Agregué un código de muestra que funciona. –

+0

Eso lo hizo. Por qué funciona así y no de la otra manera está más allá de mí, pero estoy demasiado ocupado como para preocuparme por el momento. – Kevin

0

Para los archivos de formato CSV que queremos Excel para ser utilizado para abrir, estamos utilizando: Response.ContentType = "application/msexcel";

Tal vez sin embargo se salen con esto porque no es un verdadero archivo xls,.

5
.doc 


application/msword 

.dot 


application/msword 

.docx 


application/vnd.openxmlformats-officedocument.wordprocessingml.document 

.dotx 


application/vnd.openxmlformats-officedocument.wordprocessingml.template 

.docm 


application/vnd.ms-word.document.macroEnabled.12 

.dotm 


application/vnd.ms-word.template.macroEnabled.12 

.xls 


application/vnd.ms-excel 

.xlt 


application/vnd.ms-excel 

.xla 


application/vnd.ms-excel 

.xlsx 


application/vnd.openxmlformats-officedocument.spreadsheetml.sheet 

.xltx 


application/vnd.openxmlformats-officedocument.spreadsheetml.template 

.xlsm 


application/vnd.ms-excel.sheet.macroEnabled.12 

.xltm 


application/vnd.ms-excel.template.macroEnabled.12 

.xlam 


application/vnd.ms-excel.addin.macroEnabled.12 

.xlsb 


application/vnd.ms-excel.sheet.binary.macroEnabled.12 

.ppt 


application/vnd.ms-powerpoint 

.pot 


application/vnd.ms-powerpoint 

.pps 


application/vnd.ms-powerpoint 

.ppa 


application/vnd.ms-powerpoint 

.pptx 


application/vnd.openxmlformats-officedocument.presentationml.presentation 

.potx 


application/vnd.openxmlformats-officedocument.presentationml.template 

.ppsx 


application/vnd.openxmlformats-officedocument.presentationml.slideshow 

.ppam 


application/vnd.ms-powerpoint.addin.macroEnabled.12 

.pptm 


application/vnd.ms-powerpoint.presentation.macroEnabled.12 

.potm 


application/vnd.ms-powerpoint.presentation.macroEnabled.12 

.ppsm 


application/vnd.ms-powerpoint.slideshow.macroEnabled.12 
+0

Sería fantástico si pudiera agregar su (s) fuente (s)? p.ej. [de wikipedia] (http://en.wikipedia.org/wiki/Internet_media_type) –

Cuestiones relacionadas