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

时间:2016-11-02 13:18:31

标签: php arrays file binary

我想用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”是我的连接名称正常工作。

2 个答案:

答案 0 :(得分:1)

PHP没有“字节数组”数据类型。它有一个字符串类型, 一个字节数组,用于所有意图和目的。要将文件的二进制内容读入一个与PHP中的字节数组一样接近的变量,请执行以下操作:

$content = file_get_contents($_FILES['my_file']['tmp_name']);
是的,就是这样。没什么可做的。

我对sqlsrv API并不是特别熟悉,但仔细阅读its documentation看来你可以(需要?)这样设置一个标志来将数据标记为二进制:

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

答案 1 :(得分:0)

我建议始终将您的二进制数据转换为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) );
file_data表中的

files字段可以是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