Что такое .NET c # эквивалент HTTP_RAW_POST_DATA? - PullRequest
0 голосов
/ 22 июня 2009

Я пытаюсь имитировать следующий код PHP в C #

<?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.';

?>

Пока у меня есть:

 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();
        }

Проблема заключается в том, что Request.InputStream не содержит необработанные данные изображения, отправленные из следующего сценария 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");

Я уверен, что упускаю что-то действительно простое, поэтому любые указатели будут очень благодарны.

1 Ответ

1 голос
/ 22 июня 2009

Вы звоните Response.Write(Request.InputStream) и предполагаете, что это скопирует все данные из входного потока в выходной поток. Я не вижу причин полагать, что это так. Я сильно подозреваю, что он вызовет ToString() во входном потоке, а затем запишет это как текстовые данные.

Я предлагаю вам попробовать это:

CopyStream(Request.InputStream, Response.OutputStream);

, где CopyStream - это служебный метод, реализованный следующим образом:

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...