假设我有一个PHP脚本,其中包含一堆二进制数据,需要在JavaScript中处理客户端。
<?php
$binary_data = file_get_contents( "file.data" );
?>
我有一个JavaScript函数,用于从ArrayBuffer处理它:
<script type="text/javascript">
function processData( arrayBuffer ) {
...
}
</script>
直接传递它不会起作用,因为它的二进制数据因此无法正常工作:
<?php
$binary_data = file_get_contents( "file.data" );
echo <<<EOF
<script type="text/javascript">
var binaryData = '{$binary_data}';
processData( binaryData );
function processData( arrayBuffer ) {
...
}
</script>
EOF;
?>
如何在单页加载中将PHP变量$ binary_data传递给JavaScript变量ArrayBuffer?
答案 0 :(得分:0)
我刚刚将数据转换为base64,然后在我的代码中使用它。我想也许我也可以直接创建一个数组缓冲区并用数字字节初始化它,但这最终会在HTML中变得更长。我认为base64将是基于这篇文章(Base64: What is the worst possible increase in space usage?)“最便宜”的字节数。
然后我需要将base64直接转换为ArrayBuffer。我找到了这个小宝石(https://gist.github.com/borismus/1032746),我根据自己所做的修改了一点。
最终代码(基于原文):
<?php
$binary_data = base64_encode( file_get_contents( "file.data" ) );
echo <<<EOF
<script type="text/javascript">
var binaryData = base64ToArrayBuffer( '{$binary_data}' );
processData( binaryData );
/**
* Process the binary data ArrayBuffer
*/
function processData( arrayBuffer ) {
...
}
/**
* Convert a base64 string to an ArrayBuffer
*/
function base64ToArrayBuffer( base64 ) {
var raw = window.atob( base64 );
var rawLength = raw.length;
var array = new Uint8Array( new ArrayBuffer(rawLength) );
for( i = 0; i < rawLength; i++ ) {
array[ i ] = raw.charCodeAt( i );
}
return( array.buffer );
}
</script>
EOF;
?>