我编写了从网络摄像头捕获图像的Javascript,然后我想将其序列化到我的SQL Server数据库。数据库中的字段是通常的varbinary(max)。我可以从firebug中看到原始图像正在传递给我的web方法,但它不断抛出以下错误:
“插入'797719006-'失败:Telerik.OpenAccess.RT.sql.SQLException:无法将值NULL插入列'Picture',表'GoldStar.Students.Pictures';
捕获图像的javascript绝对可以正常工作,所以我知道那里没有问题,只需将其保存到数据库即可。也许我通过使用web方法通过ajax ???
更新过于复杂的事情我在注册页面上创建了一个支持Web的方法,它看起来像这样:
[WebMethod(EnableSession = true)]
public static void UpdatePicture(object picture)
{
//Check if the user already has a picture in the database.
using (var dataContext = new DAL.GoldStarModel())
{
var userPictures = (from p in dataContext.Pictures
where p.UserId == (Guid) Membership.GetUser().ProviderUserKey
select p);
if (userPictures.Count() > 0)
{
//If user already has a picture then update.
userPictures.First().Picture = picture as byte[];
}
else
{
//If User does NOT have a picture then add one.
dataContext.Add(new Students.Pictures()
{
UserId = (Guid) Membership.GetUser().ProviderUserKey,
Picture = picture as byte[],
CreationDate = DateTime.Now
});
}
dataContext.SaveChanges();
}
相关的Javascript如下:
var canvas = document.getElementById("canvas");
var profilePic = $('#profilePic')
$('#webcam').hide();
try {
//Update the profile picture in the parent.
var currentPic = self.parent.document.getElementById('MainContent_UserFormView_RegisterUser_StudentPicture');
var oldWidth = Number(currentPic.width);
var oldHeight = Number(currentPic.height);
currentPic.src = canvas.toDataURL();
currentPic.width = oldWidth;
currentPic.height = oldHeight;
profilePic.show();
$.ajax({
type: "POST",
url: "/Account/Register.aspx/UpdatePicture",
contentType: "application/json; charset=utf-8",
data: "{'picture': '" + currentPic.src + "'}",
dataType: "json",
success: function (result) {
//ApplyTemplate(result)
}
});
}
答案 0 :(得分:1)
你是否使用了类似提琴手的东西来检查电线上的内容,因为乍一看,它只是图像的字符串路径,而不是图像数据。
在服务器上,你不能只是从一个对象转换为一个字节数组,除非你已经有一个字节数组,在这种情况下使用它作为类型。再次从您的代码中,jquery不太可能将二进制数组数据传递给您的方法。
我怀疑你需要像Silverlight或Flash这样的东西来上传图像数据。在将文件数据发送到服务器时,html沙箱非常难以实现。
<强>更新强>
您需要解析字符串。你有你需要的一切,这很好。您需要查找base64字符串的起始位置。拿那个base64字符串&amp;使用Convert.FromBase64String,它将为您提供一个作为图像的字节数组。将其存储在您的数据库中。
我会改变你的webmethod来接受一个字符串,因为这是画布生成的。一切都应该有效。