简体   繁体   中英

PHP Code to Asp.Net C#

I am using the jQuery Webcam Plugin with this code:

$("#camera").webcam({
            width: 250,
            height: 375,
            mode: "save",
            /*swffile: "js/jscam_canvas_only.swf",*/
            swffile: "js/jscam.swf",
            onTick: function(remain) {
                if (0 == remain) {
                    jQuery("#status").text("Cheese!");
                } else {
                    jQuery("#status").text(remain + " seconds remaining...");
                }
            },
            onSave: function () { },
            onCapture: function () {
                webcam.save('/upload.ashx');
            },
            debug: function () { },
            onLoad: function () { }
        });

The plugin uses PHP like this:

<?php
    $str = file_get_contents("php://input");
    file_put_contents("/tmp/upload.jpg", pack("H*", $str));
?>

and my upload.ashx :

public void ProcessRequest(HttpContext context)
{
    System.IO.Stream str = context.Request.InputStream;
    int strLen = Convert.ToInt32(str.Length);
    byte[] strArr = new byte[strLen];
    str.Read(strArr, 0, strLen);

    //string st = BitConverter.ToString(strArr); // try 1
    //string st = BitConverter.ToString(strArr).Replace("-",""); // try 2
    //string st = ByteArrayToString(strArr); //try 3
    string st = String.Concat(Array.ConvertAll(strArr, x => x.ToString("X2"))); // try 4
    File.WriteAllText(context.Server.MapPath("~/img/Webcam" + DateTime.Now.Ticks.ToString() + ".jpg"), st);
}

public static string ByteArrayToString(byte[] ba)
{
    StringBuilder hex = new StringBuilder(ba.Length * 2);
    foreach (byte b in ba)
        hex.AppendFormat("{0:x2}", b);
    return hex.ToString();
}

I also tried to read the byte array to the Bitmap object and save that to the disk, but that also does not work. I am really missing something here...

Edit Thanks Onkelborg,

I forgot to mention that the code does not give errors, it saves files. But the images are corrupted. Can't view them in Windows Photo Viewer or Adobe Photoshop.

Edit2 this also does not work. (also corrupt images) Save Image From Webrequest in C#

Edit3 I use this to convert the string to high nibble first hex:

    public static byte[] ToHexByte(byte[] arstr)
    {
        byte[] data = new byte[arstr.Length];
        int end = arstr.Length;

        for (int i = 0; i < end; i++)
        {
            byte ch = arstr[i];
            byte highNibble = (byte)((ch & 0xf0) >> 4);
            byte lowNibble = (byte)((ch & 0x0f) << 4);
            data[i] = (byte)(highNibble | lowNibble);
        }
        return data;
    }

Edit4

I found this resource http://www.kirupa.com/forum/showthread.php?300792-XML.sendAndLoad%28%29-not-working-IIS7.-ASP.Net-2.0-%28C-3.0%29 and set ValidateRequest="false" in my page directive. found that because i found line 183 from https://github.com/infusion/jQuery-webcam/blob/master/src/jscam.as i have the feeling that i am getting closer now.

The first, and biggest, problem is the fact that you try to convert from bytes to strings, that's wrong. You should save those bytes directly without "converting" them in any way.

The next problem is that you are reading your stream in the wrong way. See: How do I copy the contents of one stream to another?

The answer is: http://code.google.com/p/jpegcam/ because it is hard to find out how to decode the bytes you receive from the flash file.

Now I just needed two lines of Asp.Net C# code in my *.ashx file:

byte[] data = context.Request.BinaryRead(context.Request.TotalBytes);

File.WriteAllBytes(context.Server.MapPath("~/img/cam" + DateTime.Now.Ticks + ".jpg"), data);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM