Я использую JQuery Webcam Plugin с этим кодом:
$("#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 следующим образом:
<?php $str = file_get_contents("php://input"); file_put_contents("/tmp/upload.jpg", pack("H*", $str)); ?>
и мой 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(); }
Я также попытался прочитать массив байтов в объект Bitmap
и сохранить его на диске, но это также не работает. Мне здесь что-то не хватает …
Редактировать Спасибо Onkelborg,
Я забыл упомянуть, что код не дает ошибок, он сохраняет файлы. Но изображения повреждены. Не удается просмотреть их в Windows Photo Viewer или Adobe Photoshop.
Edit2 это тоже не работает. (также поврежденные изображения) Сохранить изображение из Webrequest в C #
Edit3 Я использую это, чтобы преобразовать строку в первый кусок первого гекса:
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
Я нашел этот ресурс http://www.kirupa.com/forum/showthread.php?300792-XML.sendAndLoad%28%29-not-working-IIS7.-ASP.Net-2.0-%28C-3.0%29 и set ValidateRequest="false"
в моей директиве на странице. обнаружил, что, поскольку я нашел строку 183 из https://github.com/infusion/jQuery-webcam/blob/master/src/jscam.as, у меня появилось ощущение, что я становлюсь ближе.
Первой и самой большой проблемой является тот факт, что вы пытаетесь преобразовать из байтов в строки, это неправильно. Вы должны сохранить эти байты напрямую, без каких-либо преобразований.
Следующая проблема заключается в том, что вы читаете свой поток не так. См.: Как скопировать содержимое одного потока в другой?
Ответ: http://code.google.com/p/jpegcam/, потому что трудно узнать, как декодировать полученные вами байты из флеш-файла.
Теперь мне просто нужны две строки кода Asp.Net C # в файле *.ashx
:
byte[] data = context.Request.BinaryRead(context.Request.TotalBytes); File.WriteAllBytes(context.Server.MapPath("~/img/cam" + DateTime.Now.Ticks + ".jpg"), data);