2012-03-28 10 views
0

Dieser WCF-Dienst gibt ein TIFF-Bild zurück. Es prüft, ob es mit unserem Repository verbunden ist - und holt die Bytes aus der Datendatei. Es überprüft, ob es sich bei der Datei um eine PDF, TIFF oder ein Bild handelt, und gibt den entsprechenden MIME-Typ zurück. Ich kann jetzt den Dienst aufrufen und es gibt die entsprechende Datei zurück - aber mit dem Bildnamen "documentID" .tif. Wie lege ich den Dateinamen des zurückgegebenen Bildes fest?Dieser WCF-Dienst gibt ein TIFF-Bild zurück. Wie lege ich den Dateinamen des zurückgegebenen Bildes fest?

[OperationContract] 
[WebInvoke(Method = "GET", UriTemplate="File/{documentID}")] 
Stream GetDocumentFile_GET(string documentID); 




public Stream GetDocumentFile_GET(string documentID) 
{ 
    if (ProprietaryClass.IsConnected) 
    { 
     ProprietaryClass _documentForViewer = new ProprietaryClass(documentID); 
     string _fileType = ProprietaryClass.NativeFileType; 
     string _mimetype = "image/tiff"; 

     switch (_fileType) 
     { 
      case "TIF": 
       _mimetype = "image/tiff"; 
       break; 
      case "PDF": 
       _mimetype = "application/pdf"; 
       break; 
      case "PNG": 
       _mimetype = "image/png"; 
       break; 
     }; 

     if (ProprietaryClass.ProprietaryMethod(_documentForViewer)) 
     { 

      ProprietaryClass _downloadToViewer = new ProprietaryClass(); 

      if (_documentForViewer.TiffFile != null) 
      { 
       _downloadToViewer = _documentForViewer.TiffFile; 
      } 
      else 
      { 
       _downloadToViewer = _documentForViewer.NativeFile; 
      } 


      MemoryStream fileStream = new MemoryStream(_downloadToViewer.FileData); 

      // fileStream is now array of bytes 
      System.ServiceModel.Web.WebOperationContext.Current.OutgoingResponse.ContentType = _mimetype; 

      return (Stream)fileStream; 
     } 
     else 
     { 
      return new MemoryStream(Encoding.UTF8.GetBytes("Document type not supported by native viewer")); 
     } 
    } 
    else 
    { 
     return new MemoryStream(Encoding.UTF8.GetBytes("Not connected")); 
    } 
} 

Antwort

1

Die beste Möglichkeit, dies in RESTful-Diensten zu tun, ist die Verwendung der Content-Disposition-Header. Die meisten Browser unterstützen dies sofort und machen ein Speichern als Dialog mit dem Namen, den die Kopfzeile vorschlägt. Wie bei anderen Clients ist es ein Treffer, wenn sie auf den Header achten. Wenn Sie den Client steuern, können Sie ihn jederzeit hinzufügen.

+0

Das hat bei mir bisher funktioniert. –

1

Statt die Stream direkt zurückkehren, kehren ein benutzerdefiniertes Objekt (z CustomStream) die Stream repräsentieren die Stream sowie den Namen der Datei, die Sie enthält.

+0

Wie würde ich das tun? Kann ich ein Filestream-Objekt verwenden? –

+0

Erstellen Sie Ihre eigene Klasse. Es kann sowohl einen Stream als auch eine Zeichenkette für den Dateinamen enthalten. – Bernard