我有一些PHP代码连接到MSSQL,查找一些值并检索以二进制格式存储的文件。该表具有文件名,标题和二进制数据。目前我的代码正在按预期下载文件,但是,如果文件名中有空格,则名称会缩短,就好像空间充当分隔符一样。例如db中的值“这是一个示例file.pdf”输出文件名“This”,浏览器识别pdf类型。
我的功能代码如下:
/* Retrieve and display the data.
The return data is retrieved as a binary stream. */
if ( sqlsrv_fetch( $stmt ) )
{
$noticeID = sqlsrv_get_field( $stmt, 0, SQLSRV_PHPTYPE_INT);
$filename = sqlsrv_get_field( $stmt, 1, SQLSRV_PHPTYPE_STRING("UTF-8"));
$header = sqlsrv_get_field( $stmt, 2, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_BINARY));
$download = sqlsrv_get_field( $stmt, 3, SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY));
header('Content-Type: '.$header);
header("Content-Disposition: attachment; filename=$filename");
echo "Your file, $filename is ready for download";
fpassthru($download);
}
else
{
echo "Error in retrieving data.</br>";
print_r( sqlsrv_errors(), true);
}
我怀疑问题是文件名在DB中存储为VARCHAR(255),并且以某种方式打破了“Content-Disposition”标题行。研究把我带到了这个页面,但是关于如何处理VARCHAR以及当我尝试通过猜测(见下文)并获取文件名“index.php”(虽然它确实下载文件)时,它并不是很清楚
$filename = sqlsrv_get_field( $stmt, 1, SQLSRV_PHPTYPE_VARCHAR);
我也试过这个代替错误的标题行:
$filename = sqlsrv_get_field( $stmt, 1, SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY)))
它仍然会切断文件名。如果文件名中没有空格,则代码执行完美。
BONUS:有谁知道如何将文件保存到文件系统而不是下载对话框?这段代码是我正在编写的数据迁移脚本的概念证明,也非常有用:)
答案 0 :(得分:1)
请尝试以下操作:按如下方式连接标题:
header('Content-Disposition: attachment; filename="'."$filename".'"');
并通过以下方式保存文件:
function file_put_contents()