2016-04-27 45 views
0

我创建一个数组缓冲区包含一些数据:发送二进制数据到服务器

var myArray = new ArrayBuffer(512); 
var longInt8View = new Uint8Array(myArray); 
for (var i = 0; i < longInt8View.length; i++) { 
    longInt8View[i] = i % 255; 
} 

而且我通过POST的服务器发送这样:

if (window.XMLHttpRequest) { 
    var xmlhttp = new XMLHttpRequest(); 
} else { 
    var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
} 
xmlhttp.onreadystatechange = function() { 
    if (xmlhttp.readyState === 4 && xmlhttp.status === 200) { 
     action(xmlhttp.responseText); 
    } 
}; 
xmlhttp.open("POST", 'http://somedomain.com:8080', true); 
xmlhttp.send(myArray); 
var action = function (response) { 
    console.log(response); 
}; 

我现在想接收这些二进制数据去代码,并用它做一些事情。我怎样才能做到这一点?

package main 

import (
     "fmt" 
     "net/http" 
) 

func handleRequest(w http.ResponseWriter, r *http.Request) { 
     w.Header().Set("Access-Control-Allow-Origin", "*") 
     w.Header().Set("Access-Control-Allow-Headers", "*") 
     w.Header().Set("Content-Type", "text/plain") 
     fmt.Fprintf(w, "%s", r.Body) 
} 

func main() { 
     http.HandleFunc("/", handleRequest) 
     http.ListenAndServe(":8080", nil) 
} 

我可以看到一个对内部存储器块的引用,但是如何获得这个特定的内容呢?

+0

请求体是['io.Reader'](https://golang.org/pkg/io/#Reader),则从它读取。 (实际上它是一个'io.ReadCloser',但你不需要关闭它在服务器上) – JimB

回答

0

不要通过HTTP协议发送二进制数据。在Base64中转换它们。将它们作为普通字符串发送。将它们从Base64解码为服务器端的二进制文件。

为二进制数据转换成BASE64可以使用功能btoa

+1

为什么不是二进制数据? – khernik

+0

您将内容类型定义为text/plain。代理可能会破坏您的请求,查看内容并将其识别为损坏的数据。 –