【问题标题】:How can i handle a file ByteArray in Javascript我如何在 Javascript 中处理文件 ByteArray
【发布时间】:2012-01-15 08:13:35
【问题描述】:

我有一个闪存记录器,它记录用户输入并在 Java 脚本中给我一个文件字节数组

现在我想将该字节数组上传到服务器(MVC3),我想知道我该怎么做?

【问题讨论】:

  • 你有没有尝试过?

标签: c# javascript asp.net-mvc-3


【解决方案1】:

您可以使用 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);
    }
});

【讨论】:

  • 这对我不起作用,首先你提供了两次数据,所以我删除了第一个,现在每次它发布到服务器时,它都会将缓冲区发布为空!
  • @Stacker,哎呀,我错了。好吧,假设您有一个如我的示例中所示的字节数组,您应该能够将其发布到一个控制器操作,该操作将以byte[] 作为参数。然后在我展示的自定义模型绑定器中,您可以读取请求流的主体。我已经对其进行了测试,并且效果很好。也许您脚本中的数据与我显示的格式不同?请注意,fromCharCode 方法不采用数组。它需要多个参数。所以如果你有一个数组[65, 66, 67],它就行不通了……
  • ...在这种情况下,您必须为字节数组的每个元素调用fromCharCode,并将其连接到您将发送到服务器的最终数据中。
  • 我根本没有改变你的代码我使用 String.fromCharCode(65, 66, 67);正如您提供的那样,有趣的是我在 BindModel 中放置了一个断点,但它从未命中它!
  • @Stacker,您是否将[ModelBinder(typeof(ByteArrayModelBinder))] 放在byte[] 操作参数前面,如我的回答中所示?我假设您没有,这可以解释为什么不调用自定义模型绑定器。
【解决方案2】:

您是否尝试过简单地将字节数组发布到控制器方法?如果您使用 jquery,则只需使用 $.ajax 或 $.post 并根据您的路由安排方式将请求发送到正确的位置。

【讨论】:

  • 我该怎么做?你能给我一个示例代码吗?因为我不确定我将如何将“ByteArray”放入控制器
  • 我所指的发帖方法与上面的 cmets 相同,类似于:
  • '// 从 A,B,C 字节创建样本数据: 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) {警报(结果);} });'
猜你喜欢
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
相关资源
最近更新 更多