2009-06-22 9 views
0

Je suis en train d'imiter le code PHP suivant en C#Quelle est l'équivilence .NET C# de HTTP_RAW_POST_DATA?

<?php 

if (isset ($GLOBALS["HTTP_RAW_POST_DATA"])) { 

    // get bytearray 
    $im = $GLOBALS["HTTP_RAW_POST_DATA"]; 

    // add headers for download dialog-box 
    header('Content-Type: image/jpeg'); 
    header("Content-Disposition: attachment; filename=".$_GET['name']); 
    echo $im; 

} else echo 'An error occured.'; 

?> 

Jusqu'à présent, j'ai:

public ActionResult GetPostedImage(string name) 
     { 
      var res = Response; 
      res.Clear(); 
      res.Cache.SetCacheability(HttpCacheability.NoCache); 
      res.ContentType = "image/jpeg"; 

      res.AppendHeader("Content-Disposition", "filename=\"" + name + "\""); 
      res.Write(Request.InputStream); 

      return View(); 
     } 

Le problème est que le Request.InputStream ne contient pas les données d'images brutes affichées parmi les options suivantes flash Actionscript:

var jpgSource:BitmapData = new BitmapData(mc_avatar.width, mc_avatar.height); 
jpgSource.draw(mc_avatar); 
trace(jpgSource); 

var jpgEncoder:JPGEncoder = new JPGEncoder(85); 
var jpgStream = jpgEncoder.encode(jpgSource); 
var header:URLRequestHeader = new URLRequestHeader("Content-type", "application/octet-stream"); 
var jpgURLRequest:URLRequest = new URLRequest("/cms3/getpostedimage?name=bloke.jpg"); 
jpgURLRequest.requestHeaders.push(header); 
jpgURLRequest.method = URLRequestMethod.POST; 
jpgURLRequest.data = jpgStream; 
navigateToURL(jpgURLRequest, "_self"); 

Je suis sûr que je manque quelque chose de vraiment de base, de sorte que tous les pointeurs seraient appréciés.

+0

euh ... question stupide, mais ce qui est exactement ce censé accomplir? Pourquoi envoyez-vous un fichier à l'utilisateur qu'ils vous ont envoyé? – Powerlord

Répondre

1

Vous appelez Response.Write(Request.InputStream) et en supposant que cela copiera toutes les données du flux d'entrée dans le flux de sortie. Je ne vois aucune raison de croire que c'est le cas. Je soupçonne fortement qu'il va appeler ToString() sur le flux d'entrée, puis l'écrire comme des données de texte.

Je vous suggère d'essayer ceci:

CopyStream(Request.InputStream, Response.OutputStream); 

CopyStream est une méthode utilitaire mis en œuvre comme ceci:

public static void CopyStream(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[8192]; 
    int read; 
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, read); 
    } 
} 
+0

Salut Jon, tu as raison! J'ai joué avec et j'ai réalisé qu'il appelait le ToString(). Donc j'ai mis: var buffer = new byte [Demande.InputStream.Length]; Request.InputStream.Read (buffer, 0, buffer.Length); res.BinaryWrite (tampon); Bien sûr, mieux vaut donc utiliser :-) – Richard

+0

Oui, ce n'est pas une bonne idée d'ignorer le résultat de Stream.Read - il n'y a aucune garantie que vous obtiendrez les résultats en un seul appel. –

Questions connexes