2010-10-15 5 views
0

J'ai un objet flux dans lequel j'ai un document, je sais quel document est-il, comment puis-je ouvrir ce document sans l'enregistrer dans un fichier physiquement. Je veux donc directement ouvrir le document à partir du flux lui-même sans le sauvegarder.Lire flux et ouvrir ce document

Comment faire? Je le fais en C#

+3

De quel type de document s'agit-il? Comment l'ouvrez-vous? Qu'est-ce qui vous empêche d'enregistrer le fichier dans un répertoire temporaire? – Jens

+0

Si vous ne nous dites pas, nous ne savons pas quel document vous avez. Cela rend difficile la recherche d'une solution. –

+0

laissez-le être PDF doc pour maintenant – Nits

Répondre

0

Voici comment je fais une telle chose, mais je connais le nom du fichier. c'est méthode est appelée dans une page ASPX vide (je veux dire sans aucune sorte de balisage HTML sauf le < @Page ... /> ligne)

private void LoadAttachment() 
    { 
      byte[] ImageData = ... get data from somewhere ... 

      Response.Buffer = true; 
      String filename = "itakethis.fromdatabase"; 
      Response.AddHeader("Content-Disposition", "attachment;filename=" + filename); 
      Response.ContentType = GetMimeType(filename);//you can try to extrapolate it from file extension 
      if(ImageData.Length > 0) 
       Response.BinaryWrite(ImageData); 
      else 
       Response.BinaryWrite(new byte[1]); 
      Response.Flush(); 
      ApplicationInstance.CompleteRequest(); 
    } 

`

+0

il y a quelques trucs utiles là-bas, mais l'OP demande à propos de 'Stream' pas' byte [] ', et puisque vous vérifiez pour' .Length' votre solution ne se traduira pas. –

+0

@Kirk Woll, désolé, mon erreur, je pensais que le problème était de sauvegarder physiquement le fichier, pas d'utiliser directement le flux. Quoi qu'il en soit, les cours d'eau ont une propriété de longueur. Si le problème est d'utiliser directement le flux, alors la réponse est non: bynarywrite prend un tableau d'octets comme argument –

0

Vous pouvez utiliser MemoryStream pour utiliser le document uniquement en RAM.

0

Malheureusement la plupart des programmes (Word, Excel, Notepad, ...) ont besoin d'un nom de fichier pour ouvrir un fichier. Donc je pense qu'il n'y a pas de vraie solution à votre problème. Le seul penser serait d'écrire un File System Filter Driver, qui renvoie le MemoryStream pour un nom de fichier virtuel, mais ce pilote doit être écrit en C++ et n'est pas le plus facile à faire.

0

Pourquoi ne pouvez-vous sauver la fichier?

J'ai utilisé GetTempFilename dans le passé. Je ne me souviens pas exactement de quelle classe il s'agit, probablement System.Environment ou File lui-même. De toute façon, vous pouvez être sûr que le fichier sera dans le dossier temporaire défini par le système, de sorte que vous pouvez supprimer le fichier en toute sécurité une fois que vous avez terminé.