从 Microsoft SQL 数据库中存储的文件创建文件系统文件

2024-01-04

标题听起来很混乱,但我不知道如何更好地描述它。

我接到的任务是将数据库从程序 A 迁移到程序 B。
程序A使用MSSQL数据库并将其所有文件存储在数据库中。
程序 B 处理以“正常”方式存储的文件,即存储在文件系统中。

现在我必须使用 PHP 提取、转换数据库存储的文件并将其下载到文件系统文件,但我尝试转换它们没有成功。

为了测试目的,我创建了一个简单的.txt包含内容的文件Test document for migration程序A将其存储在数据库中:

0x5465737420646F63756D656E7420666F72206D6967726174696F6E'

那是什么格式,如何将其转换为正常格式document.txt file ?

Edit

非常感谢@PanagiotisKanavos。现在这可以与流一起使用:

$query = "select top(1) DESCRIPTION, FILETYPE, DOCUMENT from dbo.Documents;";
$stmt = sqlsrv_query($this->sqlsrv_conn, $query);
if (sqlsrv_fetch($stmt)) {
    $document = sqlsrv_get_field($stmt, 2, SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY));
    $fileName = sqlsrv_get_field($stmt, 0, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR));
    $ext = sqlsrv_get_field($stmt, 1, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR));
    file_put_contents(
        $fileName . '.' . $ext,
        stream_get_contents($document),
    );
} 

现在,对所有文件执行此操作的最有效方法是什么?我是否必须对每一行执行查询?

通过 PDO 我可以使用$stmt->fetchAll(FETCH_ASSOC)这给了我一个很好的关联数组数组,里面有数据。
sqlsrv有类似的功能sqlsrv_fetch_array这是解释的php.net https://www.php.net/manual/en/function.sqlsrv-fetch-array.php和 [docs.microsoft],示例如下:

while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
      echo $row['LastName'].", ".$row['FirstName']."<br />";
}

但尽管我可以搜索,但我找不到一种方法来循环结果集而不获取结果集,然后单独获取混合流和字符串类型的每一行。sqlsrv_fetch_array只接受SQLSRV_FETCH_NUMERIC, SQLSRV_FETCH_ASSOC and SQLSRV_FETCH_BOTH然后结果集已经获取,我无法使用sqlsrv_get_field设置每个字段的类型。
我不是第一个需要这样的东西的人,但我找不到任何相关信息。可能我搜索错误,或者我误解了一个概念。


我找到了解决方案! 我测试了多个在线工具来解码字符串并找出编码是什么。 甚至尝试过hex2bin()但所有工具都告诉我这不是有效的十六进制字符串。

直到我偶然发现this http://string-functions.com/hex-string.aspxgodsent 工具将无效的十六进制转换为?但翻译了其余部分,结果是:

?Test document for migration

从那时起就很容易推断出0x是麻烦制造者。删除它后,转换就像一个魅力,我可以“转换”甚至更复杂的文件,例如.doc。这是代码:

file_put_contents(
    // 'DESCRIPTION' is the file name
    'files/' . $dbDocument['DESCRIPTION'] . 
    // 'FILETYPE' is the extension
    '.' . mb_strtolower($dbDocument['FILETYPE']),
    // 'DOCUMENT' is the document content hex encoded with prepended '0x'
    hex2bin(str_replace('0x', '', $dbDocument['DOCUMENT']))
);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Microsoft SQL 数据库中存储的文件创建文件系统文件 的相关文章

  • file_get_contents,HTTP 请求失败

    我尝试使用以下方式从另一个网站获取内容file get contents但我总是收到 无法打开流 HTTP 请求失败 allow url fopen 已打开 并且我已经在防火墙关闭的情况下进行了测试 但还是会出现这种情况 请问还有什么原因呢
  • Facebook 扩展权限

    更新2 好的 通过更改使其 有点 工作 loginUrl facebook gt getLoginUrl array canvas gt 1 fbconnect gt 0 req perms gt publish stream next g
  • 使用 ImapMailbox.php 按日期对 Imap 邮箱进行排序

    我有一个客户支持系统 它会在收到电子邮件时创建电子邮件 我曾经使用后缀和特殊配置来获取电子邮件以添加额外的功能 例如 我想包含从电子邮件发送的附件 系统不会执行此操作 而是创建一封带有主题的电子邮件 因此我可以通过匹配主题来包含附件 我使用
  • PHP 自定义会话处理程序问题 (PHP 7.1)

    我刚刚在计算机上从 PHP 7 0 迁移到 PHP 7 1 当前版本的 WAMP 的全新 全新安装 它似乎破坏了自定义会话处理程序中的某些内容 该处理程序应该将会话保存到数据库而不是使用文件系统 自定义处理程序类是 class db ses
  • PHP 函数 iconv 字符编码从 iso-8859-1 到 utf-8

    我正在尝试将字符串从 iso 8859 1 转换为 utf 8 但是当我找到这两个字符 和 时 函数返回 一个字符 是一个里面有两个数字的正方形 我该如何解决这个问题 我认为您正在寻找的编码是Windows 代码页 1252 http en
  • 在 Node.js 中以事务方式写入文件

    我有一个 Node js 应用程序 它将一些配置数据存储在文件中 如果更改某些设置 配置文件将写入磁盘 目前 我正在使用一个简单的fs writeFile 现在我的问题是 当 Node js 在写入文件时崩溃时会发生什么 磁盘上是否有可能存
  • Laravel 5 配置语言环境,不起作用

    已完成的修改 on 配置 应用程序 php locale gt env APP LOCALE en fallback locale gt en on env APP LOCALE pt 我也复制了 资源 lang en文件到 资源 lang
  • 我们可以在 Bash 脚本中使用 PHP 吗?

    我有一个 bash 脚本abcd sh bin sh for i in seq 8 do ssh w i uptime ps elf grep httpd wc l free m mpstat done pid sleep 1 kill 9
  • 与 PHP 相比,Python 与 HTML 的“流畅”程度如何?

    我正在考虑从使用 PHP 切换到使用 Python 来开发 Web 应用程序 但我想知道 Python 是否像 PHP 一样擅长在 HTML 中穿插 本质上 我发现它使用起来非常简单 直观将 PHP 放在我想要的位置 然后可以随意安排 组织
  • php/symfony/doctrine 内存泄漏?

    我在使用 symfony 1 4 和原则 1 2 将对象批量插入数据库时 遇到问题 我的模型有一种称为 Sector 的对象 每个对象都有多个 Cupo 类型的对象 通常范围从 50 到 200000 这些物体非常小 只是一个短标识符字符串
  • CakePHP Unfilled 单选按钮在提交时更改为不需要的值

    我有这个表单元素 form gt input ChecklistResponseGovernmentInfo driversLicenseIsOnline array type gt radio empty gt true options
  • PHP、PDO 和 SQLSRV 对一个 INSERT 语句执行多次

    我已经在 MySQL 和 Apache 服务器上使用 PDO 和 PHP 一段时间了 我最近的任务是将企业的旧 Web 应用程序转换为新设置 旧设置是标准 Linux Web 堆栈 Apache PHP MySQL Filezilla 新设
  • Twitch API - 无法使用 PHP 获取身份验证令牌

    stackoverflow 的成员们大家好 我不是一个喜欢寻求帮助的人 但在这种情况下 我认为这是解决我的问题的唯一方法 谷歌并没有给我太大帮助 所以 我的问题 我想使用 Twitch API 获取一些数据 听起来很容易 我希望是这样 下面
  • 唯一的图像哈希值即使 EXIF 信息更新也不会改变

    我正在寻找一种方法来为 python 和 php 中的图像创建唯一的哈希值 我考虑过对原始文件使用 md5 和 因为它们可以快速生成 但是当我更新 EXIF 信息 有时时区关闭 时 它会更改总和 并且哈希也会更改 有没有其他方法可以为这些文
  • PHP + MySQL 队列

    我需要一个充当队列的简单表 我的 MySQL 服务器限制是我不能使用 InnoDB 表 只能使用 MyISAM 客户 工人将同时工作 他们每次都需要接受不同的工作 我的想法是执行以下操作 伪代码 job lt SELECT FROM que
  • 访问 PHP 数组对象受保护的属性

    我正在尝试在 Symfony2 中上传多个文件 我正在尝试访问以下请求对象 但无法获取参数属性 如何将文件一一上传 我得到的错误 致命错误 无法访问第 66 行 var www File src Webmuch FileBundle Ent
  • 使用 yaml 路由描述时如何在运行时获取 Symfony2 中的路由名称?

    在这里你可以找到我的n关于 Symfony2 的第一个问题 我正在与一个分页捆绑 https github com makerlabs PagerBundle wiki使用中提供的路由名称routing yml文件 从我的角度来看 这种方法
  • 将 docker-compose.yml 中的包安装到 docker 容器中

    我是 docker 和 docker compose 的初学者 我需要你的帮助 我正在使用 docker compose 制作 PHP NGINX PostgresQL symfony 开发环境 这里是 web image nginx 1
  • SimpleXML 返回空数组

    我正在尝试使用 Google Maps API 和 PHP SimpleXML 获取城市的纬度和经度 我尝试这样做 xml simplexml load file http maps googleapis com maps api geoc
  • jQuery appendTo(), json 在 IE 6,7,8 中不起作用

    我这两天绞尽脑汁想找到解决办法 我使用 jQuery ajax 从数据库中获取值 以便在另一个框发生更改时更新一个框 php 脚本从数据库中获取值 然后输出 json 它在 FF 中工作正常 但在所有版本的 IE 中 选择框都不会更新 我已

随机推荐