Javascript 将blob发送到ASP.NET Web API
我尝试使用组件()来裁剪图像,然后通过Web API将原始图像和裁剪后的版本发送到我的服务器。我这里的问题是,我以blob数组的形式获取数据(第一个元素是原始元素,第二个元素是裁剪的),我完全不知道如何发送该数据,或者如何将其转换为能够发送到我的api 我使用javascript函数而不是直接的服务调用来传递更多的参数,这是组件支持的,并且有文档记录 下面是函数:Javascript 将blob发送到ASP.NET Web API,javascript,jquery,ajax,asp.net-web-api2,blob,Javascript,Jquery,Ajax,Asp.net Web Api2,Blob,我尝试使用组件()来裁剪图像,然后通过Web API将原始图像和裁剪后的版本发送到我的服务器。我这里的问题是,我以blob数组的形式获取数据(第一个元素是原始元素,第二个元素是裁剪的),我完全不知道如何发送该数据,或者如何将其转换为能够发送到我的api 我使用javascript函数而不是直接的服务调用来传递更多的参数,这是组件支持的,并且有文档记录 下面是函数: var uploadImage = function (formdata, progress, success, failure)
var uploadImage = function (formdata, progress, success, failure) {
var originalArray;
var croppedArray;
var apiCall = function (original, cropped) {
var params = {
name: formdata[0].name,
original,
cropped,
id: $('hidId').val()
}
$.getJSON('/api/Test/UploadImage', params, function (response) {
if (response) {
if (response.Success == true) {
success('Upload réussi')
} else {
failure('Upload échoué')
}
} else {
failure('Pas de réponse de l\'API')
}
});
};
var originalReader = new FileReader();
originalReader.onloadend = function () {
originalArray = originalReader.result;
if (originalArray != null && croppedArray != null)
apiCall(originalArray, croppedArray);
};
originalReader.readAsArrayBuffer(formdata[0]);
var croppedReader = new FileReader();
croppedReader.onloadend = function () {
croppedArray = croppedReader.result;
if (originalArray != null && croppedArray != null)
apiCall(originalArray, croppedArray);
};
croppedReader.readAsArrayBuffer(formdata[1]);
}
我知道这看起来一定很粗略,但我对这个案子一点经验都没有。当我到达$.getJSON(…)行时,控制台中出现404错误,显示只传递了“name”参数
为了以防万一,这里是我的api方法签名:
public IHttpActionResult UploadImages(string name, byte[] original, byte[] cropped, Guid id)
{
...
}
如何解决此问题并发送图像?api端的参数类型应该是什么?您可以使用带有
enctype=“multipart/form data”
属性的表单(您可以通过ajax提交该表单)
并在服务器端将其作为类型接收。
例如,取自:
我通常使用具有enctype=“multipart/form data”
属性(您可以通过ajax提交)的form
,并在服务器端将其作为HttpPostedFileBase
类型接受,我已经实现了这样的组件,问题是,通过常规表单发布发送数据只允许我获取裁剪后的图像,而不是原始图像。在与该组件的作者进行了长时间的邮件交换(非常有帮助且反应迅速)之后,结果是我只能通过ajax实现我想要的…尽管如此,当您只需要裁剪版本时,这仍然是一个有效的解决方案。但是请注意,该文件随后作为json对象传递,带有base64图像数据,而不是HttpPostedFileBase。您可以通过ajax提交表单,并且可以使用属性的输入类型file
,这将允许用户选择多个文件。我以前做过这件事,从他们的文档来看效果很好,这正是他们要求你在客户端做的事情:我知道,但是组件的构建方式是,当你使用表单post时,你只会得到裁剪过的图像,数据作为json传递(该组件将文件输入转换为包含所述json的隐藏输入)。在大多数情况下,当您只需要裁剪版本时,这是非常好的,但当您尝试同时获得这两个版本时,就不是了。
<form action="" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<input type="submit" />
</form>
[HttpPost]
public ActionResult Index(HttpPostedFileBase file) {
if (file.ContentLength > 0) {
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
file.SaveAs(path);
}
return RedirectToAction("Index");
}
<input type="file" multiple="multiple" name="files" id="files" />