如何使用php将文件内容转换为字节数组


how to convert the file content to byte array with php

我想用PHP保存(插入)一个上传的文件到数据库,数据库文件的类型是varbinary。
最后,我想有VarBinary(输出)的内容,就像当文件在c#中读取,然后存储在字节数组中,数组被插入到VarBinary。
此外,我的数据库连接是与sqlsrv。
我的文件类型只有PDF和图片。
我尝试了这段代码,但我的输出与c#的输出不同:

$handle=@fopen($_FILES["my_file"]["tmp_name"], 'rb');
$content= file_get_contents($_FILES["my_file"]["tmp_name"]);
$content = unpack("N*",$content);
$content=  implode($content);
$sql = "INSERT INTO files (file_data) VALUES (CONVERT(varbinary(MAX)?)";
$params=array();
array_push($params,$content);
$table=sqlsrv_query( $conn, $sql, $params);

"$conn"是我的连接的名称,可以正常工作。

PHP没有"字节数组"数据类型。它有一个字符串类型,其中一个字节数组。要将文件的二进制内容读入一个变量中,该变量在PHP中最接近字节数组,请执行:

$content = file_get_contents($_FILES['my_file']['tmp_name']);

是的,就是这样。没什么可做的了。

我对sqlsrv API不是特别熟悉,但是仔细阅读它的文档,您似乎可以(需要?)以这种方式设置标记,将数据标记为二进制:

sqlsrv_query($conn, 'INSERT INTO files (file_data) VALUES (?)', array(
    array($content, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING, SQLSRV_SQLTYPE_BINARY)
));

我建议始终将二进制数据转换为base64。所以它可以很容易地存储在数据库中,也可以从某个地方转移到任何地方,最小的头痛!

$handle=@fopen($_FILES["my_file"]["tmp_name"], 'rb');
$elephantContent = file_get_contents($_FILES["my_file"]["tmp_name"]);
$rabbitContent = base64_encode($elephantContent);
//Now ...
$sql = "INSERT INTO files (file_data) VALUES (?)";
sqlsrv_query($conn , $sql , array($rabbitContent) );

files表中的file_data字段可以是varchar, varbinary, blob, text !:)

现在可以从数据库中调用,并直接打包到img标签中。

<img src="data:image/jpeg;base64,PUT `file_data` CONTENTS HERE!" alt="..." />

您可以将file typealt属性存储在数据库中,并将它们放在标签中。

你甚至可以在数据库中转换成二进制(如果你坚持在db中看到二进制数据)(mysql 5.6+)

SELECT FROM_BASE64(`file_data`) as elephant_content from `files` WHERE ...

…我很确定在SQL中有等价的方法。例如:https://social.technet.microsoft.com/wiki/contents/articles/36388.transact-sql-convert-varbinary-to-base64-string-and-vice-versa.aspx