PHP代码到Asp.Net C#

PHP Code to Asp.Net C#

我将jquery网络摄像头插件与以下代码一起使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$("#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 () { }
        });

该插件使用如下PHP:

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

和my upload.ashx:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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();
}

我还尝试将字节数组读取到Bitmap对象并将其保存到磁盘,但这也不起作用。我真的错过了什么…

编辑感谢Onkelborg,

我忘了提到代码不会出错,它会保存文件。但是图像被破坏了。无法在Windows照片查看器或Adobe Photoshop中查看它们。

edit2这也不起作用。(还有损坏的图像)将WebRequest中的图像保存到C中#

edit3我使用它将字符串转换为高半字节的第一个十六进制:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    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;
    }

编辑4

我找到了这个资源http://www.kirupa.com/forum/showthread.php?300792-xml.sendandload%28%29-not-working-iis7.-asp.net-2.0-%28c-3.0%29在我的页面指令中设置ValidateRequest="false"。因为我在https://github.com/inpution/jquery-webcam/blob/master/src/jscam.as找到了第183行我觉得我越来越接近了。


答案是:http://code.google.com/p/jpegcam/因为很难找到如何解码从闪存文件接收到的字节。

现在我只需要在我的*.ashx文件中输入两行ASP.NET C代码:

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

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

第一个也是最大的问题是,您试图将字节转换为字符串,这是错误的。您应该直接保存这些字节,而不必以任何方式"转换"它们。

下一个问题是,您以错误的方式读取流。请参见:如何将一个流的内容复制到另一个流?