You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript中通过Ajax调用传递Blob值并写入SQL Server数据库?

解决Ajax传递Blob到SQL Server时的Illegal Invocation错误

嘿,我来帮你搞定这个问题!你碰到的Uncaught (in promise) TypeError: Failed to execute 'arrayBuffer' on 'Blob': Illegal invocation错误,本质是因为直接在jQuery Ajax的data里传了Blob对象——jQuery没法直接处理这种二进制类型,得换个方式来传递数据。下面是具体的解决方案:

核心问题原因

当你把Blob对象直接放到普通JavaScript对象里作为Ajax的data参数时,jQuery会尝试对这个对象进行序列化处理,这个过程会破坏Blob的原生结构,导致浏览器抛出非法调用的错误。我们需要用FormData来包装所有参数,它是浏览器原生支持的、专门用来处理表单和二进制数据的对象。

修改后的前端代码

把你的updateblobdata函数改成下面这样:

function updateblobdata(blobvalue) {
  debugger;
  /// Insert Blob into Database /// 
  console.log('updateblobdata called'); 
  const urlParams = new URLSearchParams(window.location.search); 
  const myParamtag = urlParams.get('104'); 
  const mymodelval = urlParams.get('DuganHosp-0002'); 
  var wonumval = '104'; 
  var tagnumval = 'DuganHosp-0002'; 
  var Modeval = 'U'; 

  // 用FormData包装所有参数,包括Blob
  const formData = new FormData();
  formData.append('WoNum', wonumval);
  formData.append('Tagnum', tagnumval);
  formData.append('BLOB', blobvalue); // 直接添加Blob对象
  formData.append('Mode', Modeval);

  $.ajax({ 
    url: 'TestTool_WebService.asmx/UpdateHtmlBLOBContent', 
    data: formData, // 传递FormData而非普通对象
    method: 'post', 
    dataType: 'json', 
    contentType: false, // 让浏览器自动设置正确的Content-Type
    processData: false, // 禁止jQuery处理数据,避免破坏Blob结构
    cache: false, 
    success: function (data) { 
      console.log('Blob插入成功!', data);
    },
    error: function(xhr, status, error) {
      console.error('插入失败:', error);
    }
  }); 
}

关键配置说明

  • 用FormData传递数据:FormData能原生支持二进制数据,会自动把Blob转换成服务器可识别的格式,避免jQuery序列化时的错误。
  • contentType: false:设置为false后,浏览器会自动添加multipart/form-data类型的请求头,并带上正确的边界符,确保服务器能正确解析FormData里的内容。
  • processData: false:禁止jQuery对数据进行序列化处理,防止它把Blob转换成字符串,破坏二进制数据结构。

后端WebService调整建议

ASMX WebService对FormData的直接参数绑定支持有限,建议你修改后端方法,通过HttpContext来获取参数和Blob数据:

[WebMethod]
public void UpdateHtmlBLOBContent()
{
    // 从FormData获取普通参数
    string WoNum = HttpContext.Current.Request.Form["WoNum"];
    string Tagnum = HttpContext.Current.Request.Form["Tagnum"];
    string Mode = HttpContext.Current.Request.Form["Mode"];
    
    // 获取Blob并转换成byte[]
    HttpPostedFile blobFile = HttpContext.Current.Request.Files["BLOB"];
    byte[] blobBytes = new byte[blobFile.ContentLength];
    blobFile.InputStream.Read(blobBytes, 0, blobFile.ContentLength);
    
    // 执行数据库插入逻辑,将blobBytes插入到varbinary(max)字段
    // 示例:
    // using (SqlConnection conn = new SqlConnection("你的连接字符串"))
    // {
    //     string sql = "UPDATE 表名 SET BLOB字段 = @BLOB WHERE WoNum = @WoNum AND Tagnum = @Tagnum";
    //     SqlCommand cmd = new SqlCommand(sql, conn);
    //     cmd.Parameters.AddWithValue("@BLOB", blobBytes);
    //     cmd.Parameters.AddWithValue("@WoNum", WoNum);
    //     cmd.Parameters.AddWithValue("@Tagnum", Tagnum);
    //     conn.Open();
    //     cmd.ExecuteNonQuery();
    // }
}

这样修改后,你就能成功把Blob数据插入到SQL Server的varbinary(max)字段里,不会再碰到之前的非法调用错误啦!

内容的提问来源于stack exchange,提问作者S.N. Digbijaya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 22:03:11