如何在 ASP.NET MVC 中将 base64String 转换为 blob 并通过 ajax 发送到控制器?

Posted

技术标签:

【中文标题】如何在 ASP.NET MVC 中将 base64String 转换为 blob 并通过 ajax 发送到控制器?【英文标题】:How to convert base64String to blob and send to controller via ajax in ASP.NET MVC? 【发布时间】:2021-07-19 16:40:33 【问题描述】:

我是 ajax 新手,目前我正在使用 ajax 尝试将 base64string 从视图发送到控制器并获得如下的 JsonResult:

$.ajax(
  url: "@Url.Action("UploadSignature", "JobList")",
  type: "POST",
  dataType: "json",
  data:  photoByte: base64String, eventRecordID: "123456" ,
  success: function (result) 
              if (result.success === true) 
                 alert("Signature uploaded !");
              
  ,
  error: function (XMLHttpRequest, textStatus, errorThrown) 
                  console.log(XMLHttpRequest);
         
  );

我的控制器方法如下:

[HttpPost]
    public async Task<ActionResult> UploadSignature(string photoByte, string eventRecordID)
    
         byte[] photoAfterConvert = Convert.FromBase64String(photoByte);
         ...             
         //Upload photoAfterConvert to server
         ...
         return Json(new  success = true );
    

但是,上面的代码有时不起作用,尤其是当 base64String 太长时。一旦我调用了 ajax,它就会挂起并且永远不会进入控制器方法。大约1分钟后,会触发错误回调函数,消息如下所示,无意义。

"readyState":0,"status":0,"statusText":"error"

因此,我在想有没有其他方法可以通过 ajax 将大字符串数据从视图发送到控制器?发送 blob 是一个不错的选择吗?如果是,我如何通过发送 blob 来实现它?我需要在控制器参数中放入什么数据类型才能接受 blob?

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

试试这个:

function Base62ToBlob (dataURI) 
    'use strict'
    var byteString,
        mimestring

    if (dataURI.split(',')[0].indexOf('base64') !== -1) 
        byteString = atob(dataURI.split(',')[1])
     else 
        byteString = decodeURI(dataURI.split(',')[1])
    

    mimestring = dataURI.split(',')[0].split(':')[1].split(';')[0]

    var content = new Array();
    for (var i = 0; i < byteString.length; i++) 
        content[i] = byteString.charCodeAt(i)
    

    return new Blob([new Uint8Array(content)],  type: mimestring );

从客户端调用操作方法:

function FileUploadServer (blob)    
    var fd = new FormData();
    fd.append("file", blob,  "FileName.png");
    $http.post("URL", fd, 
        headers:  'Content-Type': undefined 
    )
        .success(function (response, status, headers, config) 
          
          
        );

服务器端调用接收方法:

 public ContentResult Upload()
  
      var files = System.Web.HttpContext.Current.Request.Files;
      return CustJson( null);
   

【讨论】:

嗨@jayang pareek,感谢您提供的方法。我可以知道传递 blob 时应该在控制器中设置的数据类型是什么吗?还在用字符串吗? 不幸的是,ajax 调用仍然挂起并出现错误,还有其他选择吗? 您可以与我分享什么错误?你怎么打电话? 挂在那里2分钟后出现这个错误"readyState":0,"status":0,"statusText":"error"

以上是关于如何在 ASP.NET MVC 中将 base64String 转换为 blob 并通过 ajax 发送到控制器?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 asp.net mvc 中显示来自 s3 存储桶的上传图像

如何在 ASP.NET MVC 应用程序中将图像上传到 cloudinary?

在 C# 中将 Base64 字节数组解码为图像

如何在 ASP.Net MVC 中将列表对象显示到视图中?

如何在 ASP.NET CORE 5.0 MVC 中将登录设置为默认路由

如何在 ASP.NET MVC 中将 CSS 类应用于 Html.ActionLink?