2010-03-25 8 views
12

Je travaille sur une application web et j'ai besoin de diffuser divers fichiers. Je peux faire des fichiers PDF, des images et des documents Office plus anciens. Cependant, quand j'essaie de faire avec des documents de 2007, ça casse. Voici mon code:Comment diffuser un fichier Excel 2007 ou Word 2007 en utilisant asp.net et 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); 

L'erreur que je reçois est:

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

PK 

Toutes les suggestions?

Répondre

16

Selon une brève recherche sur le Web, les types MIME correct pour Word et Excel sont:

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/

Edit:

L'exemple simplifié suivant fonctionne pour moi. Il est différent du vôtre en ce qu'il utilise un gestionnaire générique au lieu d'un formulaire Web (ce qui est plus approprié pour quelque chose comme ça de toute façon).

Pour le tester, assurez-vous qu'il existe un fichier Excel 2007 nommé Book1.xlsx dans le dossier de niveau supérieur de l'application.

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

Essayé cela et c'est légèrement mieux. Je reçois au moins la boîte de dialogue Ouvrir/Enregistrer/Annuler. Cependant, si je clique sur ouvrir sur un fichier docx, je n'ai rien d'autre qu'une page html vierge. Si je clique sur enregistrer dans la boîte de dialogue, l'enregistre dans un fichier, puis l'ouvre, je clique sur certains messages d'erreur et puis j'obtiens le bon fichier. Pour les fichiers xlsx, si je sauvegarde puis ouvre, je reçois la même chose que docx, c'est-à-dire quelques messages d'erreur puis il s'ouvre. Toutefois, si je clique sur ouvrir sur le fichier xlsx, je dois cliquer sur quelques erreurs, puis ouvre Excel, mais au lieu des données, j'ai ma page de connexion – Kevin

+0

J'ai ajouté un exemple de code qui fonctionne. –

+0

C'est ce qu'il a fait. Pourquoi ça marche comme ça et pas l'inverse me dépasse, mais je suis trop occupé pour m'en préoccuper. – Kevin

0

Pour les fichiers au format csv que nous voulons Excel à utiliser pour ouvrir, nous utilisons: Response.ContentType = "application/msexcel";

Peut-être nous en tirer avec cela parce qu'il est pas un vrai fichier xls, cependant.

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

Ce serait bien si vous pouviez ajouter votre (vos) source (s)? par exemple. [de wikipedia] (http://en.wikipedia.org/wiki/Internet_media_type) –

Questions connexes