2010-03-25 11 views
12

Sto lavorando a un'app Web e è necessario eseguire lo streaming di vari file. Posso fare pdf, immagini e vecchi documenti di Office. Tuttavia, quando provo a fare con i documenti del 2007, si rompe. Ecco il mio codice:Come si esegue lo streaming di un file Excel 2007 o Word 2007 tramite asp.net e 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'errore che ottengo è:

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

PK 

Qualche suggerimento?

risposta

16

Secondo una breve ricerca sul web, i tipi MIME corretti per Word ed Excel sono:

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:

Il campione semplificata seguente funziona per me. È diverso dal tuo in quanto utilizza un gestore generico invece di un modulo web (che è più appropriato comunque per qualcosa di simile).

Per verificarlo, verificare che sia presente un file Excel 2007 denominato Book1.xlsx nella cartella di livello superiore dell'applicazione.

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

Provato questo ed è leggermente migliore. Sto almeno ricevendo la finestra di dialogo apri/salva/annulla. Tuttavia, se clicco su un file docx, non ottengo altro che una pagina html vuota. Se si fa clic su Salva nella finestra di dialogo, salvarlo in un file, quindi aprirlo, faccio clic su alcuni messaggi di errore e poi ottengo il file giusto. Per i file xlsx, se si salva e poi si apre, ottengo la stessa cosa di docx, cioè alcuni messaggi di errore che si aprono. Tuttavia, se faccio clic su Apri sul file xlsx, devo fare clic su alcuni errori, quindi Excel si apre, ma invece dei dati, ho la mia pagina di login – Kevin

+0

ho aggiunto codice di esempio che funziona. –

+0

Questo l'ha fatto. Perché funziona così e non l'altro modo è al di là di me, ma sono troppo occupato per preoccuparmi del momento. – Kevin

0

Per i file in formato CSV che vogliamo Excel da utilizzare per aprire, stiamo usando: Response.ContentType = "application/msexcel";

Forse abbiamo farla franca con questo, perché non è un file xls vero, però.

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

Sarebbe bello se potessi aggiungere la tua fonte (s)? per esempio. [da wikipedia] (http://en.wikipedia.org/wiki/Internet_media_type) –

Problemi correlati