【问题标题】:how to convert the file content to byte array with php如何使用php将文件内容转换为字节数组
【发布时间】:2017-03-15 19:48:39
【问题描述】:

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

【问题讨论】:

  • 为什么这个标签是 c#?
  • @Botonomous 因为我想要像 C# 的输出一样的输出。
  • 我觉得他的目的是 PHP#?
  • @yasaman-ghassemi '输出类似于 C# 的输出'是什么意思 你是说控制台输出吗?
  • @Botonomous 不,我的意思是存储在数据库中的内容。那个 varbinary 字段的内容。

标签: php arrays file binary


【解决方案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)
));

【讨论】:

    【解决方案2】:

    我建议始终将二进制数据转换为 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 属性存储在数据库中并放入标签中。

    您甚至可以将其转换为数据库中的二进制(如果您坚持在数据库中查看二进制数据)(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

    【讨论】:

      猜你喜欢
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      相关资源
      最近更新 更多