【发布时间】:2012-01-15 08:13:35
【问题描述】:
我有一个闪存记录器,它记录用户输入并在 Java 脚本中给我一个文件字节数组
现在我想将该字节数组上传到服务器(MVC3),我想知道我该怎么做?
【问题讨论】:
-
你有没有尝试过?
标签: c# javascript asp.net-mvc-3
我有一个闪存记录器,它记录用户输入并在 Java 脚本中给我一个文件字节数组
现在我想将该字节数组上传到服务器(MVC3),我想知道我该怎么做?
【问题讨论】:
标签: c# javascript asp.net-mvc-3
您可以使用 AJAX 请求将字节数组作为原始数据发送到服务器。我们可以实现一个自定义模型绑定器,它将读取原始请求正文并将其映射到byte[]:
public class ByteArrayModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var request = controllerContext.HttpContext.Request;
var buffer = new byte[request.InputStream.Length];
request.InputStream.Read(buffer, 0, buffer.Length);
return buffer;
}
}
那么我们可以有一个控制器动作来接收这个请求:
[HttpPost]
public ActionResult Upload([ModelBinder(typeof(ByteArrayModelBinder))] byte[] buffer)
{
// TODO: do something with the uploaded data
return Json(true);
}
最后在客户端发送 AJAX 请求:
// create sample data from the A,B,C bytes:
var data = String.fromCharCode(65, 66, 67);
$.ajax({
url: '@Url.Action("upload")',
type: 'POST',
contentType: 'application/octet-stream',
processData: false,
data: data,
success: function (result) {
alert(result);
}
});
【讨论】:
byte[] 作为参数。然后在我展示的自定义模型绑定器中,您可以读取请求流的主体。我已经对其进行了测试,并且效果很好。也许您脚本中的数据与我显示的格式不同?请注意,fromCharCode 方法不采用数组。它需要多个参数。所以如果你有一个数组[65, 66, 67],它就行不通了……
fromCharCode,并将其连接到您将发送到服务器的最终数据中。
[ModelBinder(typeof(ByteArrayModelBinder))] 放在byte[] 操作参数前面,如我的回答中所示?我假设您没有,这可以解释为什么不调用自定义模型绑定器。
您是否尝试过简单地将字节数组发布到控制器方法?如果您使用 jquery,则只需使用 $.ajax 或 $.post 并根据您的路由安排方式将请求发送到正确的位置。
【讨论】: